How to remove an object from an array, if it exists, with json string

0

I'm trying to create a sort of wish list. By clicking a button / product it populates or deletes, if it already exists. However, I can not delete it, I can only include it. I tried using splice , but it only works with array. The problem is to use oldlist to do the comparison. I can not.

  

Follow the explanation in the code comments

//Essa é a minha oldlist, onde vou comparar com o que adicionar.

var oldlist = '[{"id":"2","name":"casa_3","image":"/teste_2.png","url":"/teste/te_2"}]'; 


//criando array vazio
var arrayList = [];

//funcao para gerar o objeto
function Employee(id, name, image, url) {
    this.id = id;
    this.name = name;
    this.image = image;
    this.url = url;
}

//detectando click no botao
// e obtendo os dados
$( ".btn" ).click(function() {
  var id = $(this).data("id");
  var name = $(this).data("name");
  var image = $(this).data("image");
  var url = $(this).data("url");
  
  //criando objeto
  var employeeObject1 = new Employee(id,name, image,url);
  
  //populando
  arrayList.push(employeeObject1);
  
  
  //Agora eu tenho uma lista local
  //e preciso comparar com a OLDLIST
  //se ouver o objeto lá, no lugar de adicionar, eu preciso
  //excluir
  
  //1 - a old list tem o produto ID 2
  //caso eu clique no botao do produto ID 3
  // ELE FICARIA ASSIM:
  
  /* '[
  {"id":"2","name":"prod1","image":"/teste2.png","url":"/teste/te2"},{"id":"3","name":"prod3","image":"/teste3.png","url":"/teste/te3"} ]'
        */
  
  //2 - Caso ele clique no botao do produto ID 2, que é o mesmo da lista OLD, ficará vazio, pois deverá haver uma exclusao

    /*'[ ]'*/
  
  
  document.getElementById("carrinho").innerHTML = JSON.stringify(arrayList);
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><buttonclass="btn" data-id="1" data-name="prod1" data-image="/teste1.png" data-url="/teste/te1">Adicionar Produto 1</button>

<button class="btn" data-id="2" data-name="prod2" data-image="/teste2.png" data-url="/teste/te2">Adicionar Produto 1</button>

<button class="btn" data-id="3" data-name="prod3" data-image="/teste3.png" data-url="/teste/te3">Adicionar Produto 1</button>



<div id="carrinho"></div>
    
asked by anonymous 23.11.2017 / 18:40

2 answers

2

Dude you can use lodash

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><scriptsrc="lodash.js"></script>
<button class="btn" data-id="1" data-name="prod1" data-image="/teste1.png" data-url="/teste/te1">Adicionar Produto 1</button>

<button class="btn" data-id="2" data-name="prod2" data-image="/teste2.png" data-url="/teste/te2">Adicionar Produto 1</button>

<button class="btn" data-id="3" data-name="prod3" data-image="/teste3.png" data-url="/teste/te3">Adicionar Produto 1</button>


<div id="carrinho"></div>
<script>
    //Essa é a minha oldlist, onde vou comparar com o que adicionar.

    var oldlist = JSON.parse('[{"id":"2","name":"casa_3","image":"/teste_2.png","url":"/teste/te_2"}]');


    //criando array vazio
    var arrayList = [];

    //funcao para gerar o objeto
    function Employee(id, name, image, url) {
        this.id = id;
        this.name = name;
        this.image = image;
        this.url = url;
    }

    //detectando click no botao
    // e obtendo os dados
    $(".btn").click(function () {
        var id = $(this).data("id");
        var name = $(this).data("name");
        var image = $(this).data("image");
        var url = $(this).data("url");

        //criando objeto
        var employeeObject1 = new Employee(id, name, image, url);

        newItem = _.filter(oldlist, function (item) {
            return item.id == employeeObject1.id
        });

        if(newItem.length > 0){
            oldlist = _.filter(oldlist, function (item) {
                return item.id != newItem[0].id
            });
        }else{
            oldlist.push(employeeObject1);
        }

        //Agora eu tenho uma lista local
        //e preciso comparar com a OLDLIST
        //se ouver o objeto lá, no lugar de adicionar, eu preciso
        //excluir

        //1 - a old list tem o produto ID 2
        //caso eu clique no botao do produto ID 3
        // ELE FICARIA ASSIM:

        /* '[
        {"id":"2","name":"prod1","image":"/teste2.png","url":"/teste/te2"},{"id":"3","name":"prod3","image":"/teste3.png","url":"/teste/te3"} ]'
              */

        //2 - Caso ele clique no botao do produto ID 2, que é o mesmo da lista OLD, ficará vazio, pois deverá haver uma exclusao

        /*'[ ]'*/


        document.getElementById("carrinho").innerHTML = JSON.stringify(oldlist);

    });
</script>
    
23.11.2017 / 19:13
1

Since the existence test is based on id you can use map to catch only the id and indexOf . This gives -1 if it does not exist or a positive index when it exists.

Example:

//Essa é a minha oldlist, onde vou comparar com o que adicionar.

var oldlist = '[{"id":"2","name":"casa_3","image":"/teste_2.png","url":"/teste/te_2"}]'; 

document.getElementById("carrinho").innerHTML = oldlist;

//representação em array da oldlist
var arrayList = JSON.parse(oldlist);

//funcao para gerar o objeto
function Employee(id, name, image, url) {
    this.id = id;
    this.name = name;
    this.image = image;
    this.url = url;
}

//detectando click no botao
// e obtendo os dados
$( ".btn" ).click(function() {
  var id = $(this).data("id").toString(); //em string para coincidir com o json
  var name = $(this).data("name");
  var image = $(this).data("image");
  var url = $(this).data("url");
  
  //criando objeto
  var employeeObject1 = new Employee(id,name, image,url);
 
  let index = arrayList.map(x=>x.id).indexOf(id); //apanhar o indice com map e indexOf
  if (index === -1){ //se não existe adiciona
    arrayList.push (employeeObject1);
  }
  else { //se existe remove
    arrayList.splice(index,1);
  }

  oldlist = JSON.stringify(arrayList); //aplica a alteração na oldlist
  
  //escreve o atualizado no html
  document.getElementById("carrinho").innerHTML = oldlist; 
  
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><buttonclass="btn" data-id="1" data-name="prod1" data-image="/teste1.png" data-url="/teste/te1">Adicionar Produto 1</button>
<button class="btn" data-id="2" data-name="prod2" data-image="/teste2.png" data-url="/teste/te2">Adicionar Produto 2</button>
<button class="btn" data-id="3" data-name="prod3" data-image="/teste3.png" data-url="/teste/te3">Adicionar Produto 3</button>

<div id="carrinho"></div>
    
23.11.2017 / 19:46