Объединить объекты в массиве на основе других значений

1

Я пытаюсь объединить набор строк в массиве на основе ряда подходящих свойств и удалить элементы, которые были дублирующими.

Мой текущий массив:

{id: "12", value: "Option 1"},
{id: "55", value: "Option A"},
{id: "55", value: "Option B"},
{id: "55", value: "Option C"},
{id: "55", value: "Option D"},
{id: "106", value: "Option 1"}

Я хочу объединить все элементы с идентификатором '55', поэтому мой массив будет выглядеть так:

{id: "12", value: "Option 1"},
{id: "55", value: "Option A, Option B, Option C, Option D"},
{id: "106", value: "Option}

Я могу только объединить первые 2 элемента, используя цикл for и проверив -1 sibling, и не могу это сделать без серьезного раздувания кода.

Любой совет будет принят во внимание.

  • 0
    Можете ли вы опубликовать свой код для цикла?
  • 0
    Я почти точно использовал то, что написал Усман Рана (вложенный в цикл), но забыл условие i! = J и получал неровности.
Теги:
arrays
merge

3 ответа

2
Лучший ответ

Вы можете использовать объект в качестве таблицы поиска, одновременно сохраняя результаты в массиве:

const lookup = {}, result = [];

for( const {id, value} of input ){
  if(lookup[id]){
     lookup[id].value += "," + value;
  }else{
     result.push( lookup[id] = {id, value} );
  }
}

Это совершенно новый javascript, но он работает на современных машинах;)

1

Немного поздно может быть. Но вы можете попробовать это с циклом for/while while. Это очень простой подход. И если сложность времени не вызывает беспокойства. В противном случае Джонс ответ будет хорошим.

var x = [{id: "12", value: "Option 1"},
{id: "55", value: "Option A"},
{id: "55", value: "Option B"},
{id: "55", value: "Option C"},
{id: "55", value: "Option D"},
{id: "12", value: "Option D"},
{id: "53", value: "Option D"},
{id: "106", value: "Option 1"}];

for(var j =0; j<x.length;j++){
for(var i =0; i<x.length;i++){
  if(x[j].id == x[i].id && i !=j){
     x[j].value = x[j].value + "," +x[i].value;
     x.splice(i, 1);
     }
  }
}
console.log(x);
  • 0
    Спасибо, Усман, я пробовал цикл for с вложенным циклом for, но забыл про i! = J и получал проблемы. Я принял верхний ответ, так как это довольно маленький фрагмент кода, но это то, к чему я бы пришел изначально.
  • 0
    Вы все еще можете дать ему голос: p
Показать ещё 1 комментарий
0

Вы можете использовать array#reduce.

const data = [{id: "12", value: "Option 1"},{id: "55", value: "Option A"},{id: "55", value: "Option B"},{id: "55", value: "Option C"},{id: "55", value: "Option D"},{id: "106", value: "Option 1"}];

var result = data.reduce((r, o) => {
  return r[o.id] = r[o.id] ? (r[o.id].value += ", " + o.value, r[o.id]) : o, r;
},{})

var output = Object.values(result);
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню