2016-08-26 2 views
0

Мне было любопытно, был ли более короткий способ выполнить это?Есть ли более короткий способ слияния дублированных объектов

Проверьте, есть ли дубликаты путем сопоставления определенных свойств затем нажмите дублированные array.items в оригинальных array.items

var array = [ 
    {type: "Fruit", something: "abc", more: "properties", items: [{word:"Apple", abc: "ok"}]}, 
    {type: "Fruit", something: "abc", more: "properties", items: [{word:"Orange", abc: "ok"}]} 
]; 

объединения (массив) стал бы

array = [ 
    {type: "Fruit", something: "abc", more: "properties", items:[{word:"Apple", abc: "ok"}, {word:"Orange", abc: "ok"}]} 
]; 

    merge: function(arr) { 
     var rec, dupeIndices, foundDupes; 
     for (var idx = 0, len = arr.length; idx < len - 1; ++idx) { 
      rec = arr[idx]; 
      if (rec === null) continue; 
      dupeIndices = findDupeIndices(rec, arr.slice(idx + 1), idx + 1); 
      if (dupeIndices.length === 0) continue; 
      foundDupes = true; 
      processDupes(rec, dupeIndices, arr); 
     } 
     if (foundDupes) cleanUp(arr); 
    }, 
    cleanUp: function(arr) { 
     for (var idx = 0; idx < arr.length; ++idx) { 
      if (arr[idx] === null) arr.splice(idx--, 1); 
     } 
    }, 
    processDupes: function(rec, dupeIndices, arr) { 
     var dupeRealIdx, dupeRec; 
     for (var dupeIdx = 0, dupesLen = dupeIndices.length; dupeIdx < dupesLen; ++dupeIdx) { 
      dupeRealIdx = dupeIndices[dupeIdx]; 
      dupeRec = arr[dupeRealIdx]; 
      updateRecord(rec, dupeRec); 
      arr[dupeRealIdx] = null; 
     } 
    }, 
    findDupeIndices: function(rec, arr, offset) { 
     var other, result = []; 
     for (var idx = 0, len = arr.length; idx < len; ++idx) { 
      other = arr[idx]; 
      if (other === null) continue; 
      if (isDupe(rec, other)) result.push(idx + offset); 
     } 
     return result; 
    }, 
    isDupe: function(a, b) { 
     return (a.type === b.type && a.something === b.something); 
    }, 
    updateRecord: function(rec, dupe) { 
     for (var i = 0; i < dupe.items.length; i++) { 
      rec.items.push(dupe.items[i]); 
     } 
    } 
+0

http://stackoverflow.com/questions/ 30025965/merge-duplicate-objects-in-array-of-objects –

+0

Что такое ожидаемый результат для массива? –

+0

Я отредактировал, потому что ваши структуры данных не были отформатированы как код и, следовательно, не очень читаемы. Если вы хотите отредактировать еще кое-что, чтобы прояснить ситуацию, вы можете сделать это самостоятельно с помощью ссылки «Изменить». – jfriend00

ответ

1

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

var obj = [ 
    {type: "Fruit", something: "abc", more: "properties", items: [{word:"Apple", abc: "ok"}]}, 
    {type: "Fruit", something: "abc", more: "properties", items: [{word:"Orange", abc: "ok"}]} 
]; 

var sorted = {}; 
obj.forEach(function(element){ 
    if(sorted[element.type]){ 
    sorted[element.type].items.push.apply(sorted[element.type].items,element.items) 
    }else{ 
    sorted[element.type] = { 
     type: element.type, 
     something: element.something, 
     more: element.more, 
     items:element.items 
    } 
    } 

}); 

var sortedarray = Object.keys(sorted).map(function(item){ 
return sorted[item]}); 

console.log(sortedarray); 

рабочий пример: http://codepen.io/nilestanner/pen/NAkZbz

+0

Не могли бы вы объяснить, почему я бы использовал push.apply вместо .push –

+0

Я использовал push.apply, потому что я объединил два массива. В вашем примере объект Items был массивом, поэтому таким образом добавляются все элементы объекта –

1

вам нужно сделать удалить дубликаты?

var arr = [ 
    {type: "Fruit", items:[{word:"Apple"}]}, 
    {type: "Fruit", items:[{word:"Orange"}]} 
]; 

var obj = arr.reduce(function(obj, i) { 
    obj[i.type] = [].concat(obj[i.type] || [], i.items); return obj;  
}, {}); 

var res = []; 
for (var key in obj) 
    res.push({type: key, items: obj[key]}); 
    // or to unique items 
    // res.push({type: key, items: obj[key].filter(function (e, i, r) { return r.indexOf(e) == i})}); 

console.log(res); 
+0

Да, мне нужно будет удалить дубликаты, также мне нужно будет сопоставить несколько свойств. –

Смежные вопросы