Я пытаюсь объединить набор строк в массиве на основе ряда подходящих свойств и удалить элементы, которые были дублирующими.
Мой текущий массив:
{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, и не могу это сделать без серьезного раздувания кода.
Любой совет будет принят во внимание.
Вы можете использовать объект в качестве таблицы поиска, одновременно сохраняя результаты в массиве:
const lookup = {}, result = [];
for( const {id, value} of input ){
if(lookup[id]){
lookup[id].value += "," + value;
}else{
result.push( lookup[id] = {id, value} );
}
}
Это совершенно новый javascript, но он работает на современных машинах;)
Немного поздно может быть. Но вы можете попробовать это с циклом 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);
Вы можете использовать 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; }