2017-09-23 111 views
0

我要合併2物體相同的密鑰,值從2陣列,這樣的事情:合併2物體相同的密鑰,值從2陣列

var arr1 = [ 
    { a: "a", 1: 1, 2: 2 }, 
    { a: "b", 1: 1, 2: 3 } 
]; 

var arr2 = [ 
    { a: "a", 3: 123 }, 
    { a: "b", 3: 4411 } 
]; 

var arr3 = _.map(arr1, function(a1) { 
    var a3 = {}; 

    _.map(arr2, function(a2) { 
     if (a1.a == a2.a) { 
      a3 = _.extend(a1, a2); 
     } 
    }) 

    return a3 
}); 

結果:

arr3 = [ 
    { '1': 1, '2': 2, '3': 123, a: 'a' }, 
    { '1': 1, '2': 3, '3': 4411, a: 'b' } 
] 

不它看起來很愚蠢?有沒有其他方法可以做到這一點? 感謝您的閱讀。

+1

是您的解決方案工作與否?問題是什麼? – brk

+0

它的工作,但我認爲有一些其他更好的方法來做到這一點與一些 圖書館。 (即時通訊尚未測試大陣列長度) – Bee

+0

雖然張貼問題,請更具體。例如提及您使用的是哪個JavaScript庫。它將幫助人們調查你使用的類似圖書館。 –

回答

1

可以做

var arr1 = [ 
 
    { a: "a", 1: 1, 2: 2 }, 
 
    { a: "b", 1: 1, 2: 3 } 
 
]; 
 

 
var arr2 = [ 
 
    { a: "a", 3: 123 }, 
 
    { a: "b", 3: 4411 } 
 
]; 
 

 
let result = arr1.map((e) => { 
 
    for(let element of arr2){ 
 
     if(e.a == element.a) Object.assign(e, element); 
 
    } 
 
    return e; 
 
}); 
 
console.log(result);

2

使用一個lodash鏈concat陣列,group類似的對象,然後merge各組的單個對象:

var arr1 = [{ a: "a", 1: 1, 2: 2 }, { a: "b", 1: 1, 2: 3 }]; 
 
var arr2 = [{ a: "a", 3: 123 }, { a: "b", 3: 4411 }]; 
 

 
var result = _(arr1) 
 
    .concat(arr2) // concat the 2nd array 
 
    .groupBy('a') // group by the identical key 
 
    .map(_.spread(_.curry(_.merge, {}))) // left currey merge to to create a new empty object, and spread the group as parameters 
 
    .value(); 
 
    
 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

隨着ES6,您可以使用Array#reduce收集在一個Map類似的物體,然後拿到Map#values迭代器,並使用spread syntax轉換爲一個數組:

const arr1 = [{ a: "a", 1: 1, 2: 2 }, { a: "b", 1: 1, 2: 3 }]; 
 
const arr2 = [{ a: "a", 3: 123 }, { a: "b", 3: 4411 }]; 
 

 
const result = [...arr1.concat(arr2) // concat the arrays 
 
    .reduce((m, o) => m.set(o.a, Object.assign(m.get(o.a) || {}, o)), // use a map to collect similar objects 
 
    new Map() 
 
).values()]; // get the values iterator of the map, and spread into a new array 
 
    
 
console.log(result);

+0

Lodash方式工作。 ES6版本雖然不工作。 – Ajinkya

+0

@Ajinkya - 您是否嘗試過運行代碼段?如果是這樣,你使用什麼瀏覽器? –

+0

我的不好。我沒有替換es6代碼片段的屬性'a'。這兩個片段都在工作。考慮到性能,你推薦使用哪一種? – Ajinkya