0

的數組元素內的對象:如何遍歷和比較給出的下面陣列結構在javascript

[{ _id: '1234', characteristics: [[Object], [Object]]}, 
{ _id: '1234',characteristics: [[Object], [Object]]}, 
{ _id: '4567', characteristics: [[Object], [Object]]}, 
{ _id: '4567',characteristics: [ [Object], [Object]]}, 
{ _id: '4987',characteristics: [ [Object], [Object]]}] 

如何可以比較一個數組元素的下一個,並具有相同ID合併對象?

最終結果是一樣的東西

[ { _id: '1234', characteristics: [ [Object], [Object] ,[Object], [Object] ]}, 
{ _id: '4567',characteristics: [ [Object], [Object] , [Object], [Object]]}, 
{ _id: '4987', characteristics: [ [Object], [Object] ] } ] 

基本上裏面都爲1234的對象id的對象一起下特徵合併。

我一直盯着過去2個小時,有人有什麼想法嗎?我更喜歡更實用的方法。

編輯:我使用的是基於Nenad Vracar解決方案的解決方案。

function mergeDupKey(data) { 
    var o = {} 
    return data.reduce(function(r, e) { 
     if (!o[e._id]) { 
      o[e._id] = e; 
      r.push(o[e._id]); 
     } else { 
      o[e._id].characteristics = o[e._id].characteristics.concat(e.characteristics); 
    } 
    return r; 
}, []) 
} 

var g = mergeDupKey(data)` 
+0

你能分享辦法,你已經嘗試過? – evolutionxbox

+0

您需要**減少**您的陣列。 – Amit

回答

2

您可以將reduce()與一個幫助對象一起使用。您還可以使用concat()代替...push()like this

var data = [{ _id: '1234', characteristics: [[1], [2]]}, 
 
{ _id: '1234',characteristics: [[3], [4]]}, 
 
{ _id: '4567', characteristics: [[5], [6]]}, 
 
{ _id: '4567',characteristics: [ [7], [8]]}, 
 
{ _id: '4987',characteristics: [ [9], [10]]}]; 
 

 
var o = {} 
 
var result = data.reduce(function(r, e) { 
 
    if (!o[e._id]) { 
 
    o[e._id] = e; 
 
    r.push(o[e._id]); 
 
    } else { 
 
    o[e._id].characteristics.push(...e.characteristics); 
 
    } 
 
    return r; 
 
}, []) 
 

 
console.log(result)

+0

這太棒了!它比我提出的方法簡單得多。雖然這是ES6唯一正確的?由於...傳播運營商在那裏 –

+0

是傳播運營商是ES6,但你可以使用concat()而不是https://jsfiddle.net/Lg0wyt9u/1284/ –

+0

真棒!謝謝= D –

0

這可以用.reduce()完成。不需要輔助對象。

var data = [{ _id: '1234', characteristics: [[1], [2]]}, 
 
{ _id: '1234',characteristics: [[3], [4]]}, 
 
{ _id: '4567', characteristics: [[5], [6]]}, 
 
{ _id: '4567',characteristics: [ [7], [8]]}, 
 
{ _id: '4987',characteristics: [ [9], [10]]}]; 
 

 
var found = false; 
 
var result = data.reduce(function(prev, curr) { 
 
    prev.forEach(function(obj) { 
 
    if (obj._id == curr._id) { 
 
     obj.characteristics = obj.characteristics.concat(curr.characteristics); 
 
     found = true; 
 
    } 
 
    }); 
 
    if (!found) 
 
    prev.push(curr); 
 
    found = false; 
 
    return prev; 
 
}, []); 
 

 
console.log(result)

1

使用Array.prototype.reduce和哈希表組的屬性 - 請參閱下面的演示:

var array=[{_id:'1234',characteristics:[[1],[2]]},{_id:'1234',characteristics:[[3],[4]]},{_id:'4567',characteristics:[[5],[6]]},{_id:'4567',characteristics:[[7],[8]]},{_id:'4987',characteristics:[[9],[10]]}]; 
 

 
var result = array.reduce(function(hash) { 
 
    return function(prev,curr){ 
 
    if(hash[curr._id]) { 
 
     curr.characteristics.forEach(function(e){ 
 
     hash[curr._id].push(e); 
 
     }); 
 
    } else { 
 
     hash[curr._id] = curr.characteristics; 
 
     prev.push({_id: curr._id, characteristics:hash[curr._id]}) 
 
    } 
 
    return prev; 
 
    }; 
 
}(Object.create(null)), []); 
 

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

0

使用ES5方法:

var lst = [{ _id: '1234', characteristics: [[Object], [Object]]}, 
{ _id: '1234',characteristics: [[Object], [Object]]}, 
{ _id: '4567', characteristics: [[Object], [Object]]}, 
{ _id: '4567',characteristics: [ [Object], [Object]]}, 
{ _id: '4987',characteristics: [ [Object], [Object]]}]; 

var result = []; 

var findById = function(id) { 
    for (var i = 0; i < result.length; i++) { 
     var item = result[i]; 
     if (item._id === id) { 
      return item; 
     } 
    } 
    var newitem = { _id: id, characteristics: [] }; 
    result.push(newitem); 
    return newitem; 
} 

lst.forEach(function(item) { 
    var aux = findById(item._id); 
    aux.characteristics.concat(item.characteristics); 
}); 

console.log(result); 

使用ES6:

var lst = [{ _id: '1234', characteristics: [[Object], [Object]]}, 
{ _id: '1234',characteristics: [[Object], [Object]]}, 
{ _id: '4567', characteristics: [[Object], [Object]]}, 
{ _id: '4567',characteristics: [ [Object], [Object]]}, 
{ _id: '4987',characteristics: [ [Object], [Object]]}]; 

var result = []; 

lst.forEach(item => { 
    var aux = result.find(it => it._id === item._id); 
    if (!aux) { 
     aux = { _id: item._id, characteristics: [] }; 
     result.push(aux); 
    } 
    aux.characteristics.concat(item.characteristics); 
}); 

console.log(result); 
0

你可以做如下:

var data = [{ _id: '1234', characteristics: [["whatever"], ["whatever"]]}, 
 
      { _id: '1234', characteristics: [["whatever"], ["whatever"]]}, 
 
      { _id: '4567', characteristics: [["whatever"], ["whatever"]]}, 
 
      { _id: '4567', characteristics: [["whatever"], ["whatever"]]}, 
 
      { _id: '4987', characteristics: [["whatever"], ["whatever"]]}], 
 
    lut = data.reduce((p,c) => p[c._id] ? (p[c._id].characteristics.push(...c.characteristics),p) 
 
             : (p[c._id] = c, p), {}); 
 
    result = Object.keys(lut) 
 
       .map(k => lut[k]); 
 
console.log(result);