Concatenate id by description in an array in javascript

1

I have an array in js with only an id and a description, for example:

var variavel = [{id: 1, descrição: 'Brasil'},
             {id: 2, descrição: 'Brasil'},
             {id: 3, descrição: 'Chile'},
             {id: 4, descrição: 'Chile'},
             {id: 5, descrição: 'Chile'},
             {id: 6, descrição: 'Argentina'}];

But I would like to concatenate the id and leave the description only, basically this way:

var variavel = [{id: '1,2', descrição: 'Brasil'},
                     {id: '3,4,5', descrição: 'Chile'},
                     {id: '6', descrição: 'Argentina'}];

How can I do this? Would a loop/for solve?

NOTE: I do not use / can use Jquery in this project

    
asked by anonymous 12.12.2018 / 21:13

5 answers

1

Two loops solve. The first one goes through the variable with the repeated fields, inside it makes a new loop to check if that object already exists in the new variable, if it exists, it updates the id, if not, it adds

const variavel = [
  {id: 1, descrição: 'Brasil'},
  {id: 2, descrição: 'Brasil'},
  {id: 3, descrição: 'Chile'},
  {id: 4, descrição: 'Chile'},
  {id: 5, descrição: 'Chile'},
  {id: 6, descrição: 'Argentina'}
];

const novaVariavel = [];

for (const objeto of variavel) {
  let existe = false;

  for (let i = 0; i < novaVariavel.length; i++) {
    if (objeto['descrição'] === novaVariavel[i]['descrição']) {
      novaVariavel[i].id += ',${objeto.id}';
      existe = true;
    }
  }

  if (!existe) {
    novaVariavel.push(objeto);
  }
}

console.log(novaVariavel)
    
12.12.2018 / 21:46
1

There are several ways to do this. I recommend using the forEach Javascript method to iterate over your array, and compose a new array. It would look something like this:

// Array com os valores indicados no enunciado.
var array = [
    {id: '1', descricao: 'Brasil'},
    {id: '2', descricao: 'Brasil'},
    {id: '3', descricao: 'Chile'},
    {id: '4', descricao: 'Chile'},
    {id: '5', descricao: 'Chile'},
    {id: '6', descricao: 'Argentina'}
];

// Novo Array que será populado de acordo com a lógica apresentada.
var novoArray = [];

// Aqui usamos o método do Javascript, forEach, presente nos arrays para percorrer os objetos
array.forEach(function(item){
    // Aqui vamos verificar através do método map, se a descrição já foi salva dentro do novoArray.
    var indice = novoArray.map(function(e) { 
        return e.descricao; 
    }).indexOf(item.descricao);

    // Se achamos, vamos nesse índice localizado, e concatenamos o ID ao já existente
    // Se não, usamos o método push, para atribuir o novo item ao novoArray.
    if(indice >= 0) {
        novoArray[indice].id += ', ' + item.id;
    } else {
        novoArray.push(item);
    }
});

console.log(novoArray);

At the end the variable novoArray will have the following value as requested:

[
  {
    "id": "1, 2",
    "descricao": "Brasil"
  },
  {
    "id": "3, 4, 5",
    "descricao": "Chile"
  },
  {
    "id": "6",
    "descricao": "Argentina"
  }
]
    
12.12.2018 / 21:48
1

I will do my collaboration with an O (n) algorithm rather than O (n ^ 2), using two non-nested loopbacks.

The first loop groups id by country:

var grupos = {};
lista.forEach(function(obj) {
    grupos[obj.descricao] = grupos[obj.descricao] || [];
    grupos[obj.descricao].push(obj.id)
});

The content of grupo is now:

{
    "Brasil": [1, 2],
    "Chile": [3, 4, 5],
    "Argentina": [6]
}

In the second loop I just scroll the previous object and populate the array with the desired data:

Object.keys(grupos).forEach(function(pais) {
    resultado.push({
        id: grupos[pais].join(','),
        descricao: pais
    });
});

Result:

[
    {
        "id": "1,2",
        "descricao": "Brasil"
    },
    {
        "id": "3,4,5",
        "descricao": "Chile"
    },
    {
        "id": "6",
        "descricao": "Argentina"
    }
]

Code working:

let lista = [
  {id: 1, descricao: 'Brasil'},
  {id: 2, descricao: 'Brasil'},
  {id: 3, descricao: 'Chile'},
  {id: 4, descricao: 'Chile'},
  {id: 5, descricao: 'Chile'},
  {id: 6, descricao: 'Argentina'}
];
 
let grupos = {};

lista.forEach(obj => {
  grupos[obj.descricao] = grupos[obj.descricao] || [];
  grupos[obj.descricao].push(obj.id)
});

let resultado = [];

Object.keys(grupos).forEach(pais => {
  resultado.push({
    id: grupos[pais].join(','),
    descricao: pais
  })
});

console.log(resultado)
    
12.12.2018 / 22:02
0

I think you need something like this (by running):

var groups = {};
for (var i = 0; i < variavel.length; i++) {
    var groupName = variavel[i].descrição;
    if (!groups[groupName]) {
        groups[groupName] = [];
    }
    groups[groupName].push(variavel[i].id);
}
    variavel = [];
    for (var groupName in groups) {
    variavel.push({descrição: groupName, id: groups[groupName]});
}

I hope I have helped. Hugs,

    
12.12.2018 / 21:39
0

Among many answers, there is one more option:

var lista = [{id: 1, descrição: 'Brasil'},
             {id: 2, descrição: 'Brasil'},
             {id: 3, descrição: 'Chile'},
             {id: 4, descrição: 'Chile'},
             {id: 5, descrição: 'Chile'},
             {id: 6, descrição: 'Argentina'}];

    var result = [...lista.reduce((item, {id,descrição}) => {
      if (!item.has(descrição)) 
        item.set(descrição, {id,descrição});
      
      item.get(descrição).id = item.get(descrição).id == id ? String(id) : item.get(descrição).id + ',' + id;
      return item;
    }, new Map()).values()];

    console.log(result);
    
12.12.2018 / 22:34