2017-04-07 85 views
0

我有2個陣列匹配後,我要根據具體情況而定,這些2個陣列的內容相匹配合併2陣列到新陣列其內容的JavaScript

arr1 = [{ 
    package_id: 'aabbccdd', 
    level: 2 
    }, 
    { 
    package_id: 'xycd21', 
    level: 3 
    } 
] 

arr2 = [{ 
    package_id: 'aabbccdd', 
    level: 1 
    }, 
    { 
    package_id: 'zcb21', 
    level: 5 
    }] 

mergedArray = [{ 
    package_id: 'aabbccdd', 
    arr1Level: 2, 
    arr2Level: 1 
    }, 
    { 
    package_id: 'xycd21', 
    arr1Level: 3, 
    arr2Level: 0 
    }, 
    { 
    package_id: 'zcb21', 
    arr1Level: 0, 
    arr2Level: 5 
    }] 

所以如果package_id與被檢查的新數組在兩個陣列中。如果在兩個數組中找到,則新數組推送一個元素,其中這兩個數組的級別都是針對package_id提到的。

我只是無法弄清楚這樣做的邏輯。如果這可以通過lodash好好告訴我。

+0

你嘗試過什麼?如果你分享 – Rajesh

+2

,那麼即使算法也會很棒你應該自己編寫代碼**如果你有問題,你可以**發佈你已經嘗試過的**以及**清楚的解釋什麼不工作**並提供[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。堆棧溢出不是一種編碼服務。 – George

+0

可能重複:http://stackoverflow.com/questions/33850412/merge-javascript-objects-in-array-with-same-key。它不是完全重複的,所以沒有投票結束,但應該給你你需要解決的問題。 – Rajesh

回答

2

您可以輕鬆地解決這個使用循環像我一樣在這裏:

var arr1 = [{ 
 
    package_id: 'aabbccdd', 
 
    level: 2 
 
    }, 
 
    { 
 
    package_id: 'xycd21', 
 
    level: 3 
 
    } 
 
]; 
 

 
var arr2 = [{ 
 
    package_id: 'aabbccdd', 
 
    level: 1 
 
    }, 
 
    { 
 
    package_id: 'zcb21', 
 
    level: 5 
 
    } 
 
]; 
 
    
 
var mergedArr = []; 
 
var tempObj = {}; 
 

 
for(var i = 0; i < arr1.length; i++){ 
 
    tempObj.package_id = arr1[i].package_id; 
 
    tempObj.arr1Level = arr1[i].level; 
 
    tempObj.arr2Level = 0; 
 
    for(var k = 0; k < arr2.length; k++){ 
 
    if(arr1[i].package_id === arr2[k].package_id){ 
 
     tempObj.arr2Level = arr2[k].level; 
 
    } 
 
    } 
 
    mergedArr.push(tempObj); 
 
    tempObj = {}; 
 
} 
 

 
for(i = 0; i < arr2.length; i++){ 
 
    var isNew = true; 
 
    for(k = 0; k < mergedArr.length; k++){ 
 
    if(arr2[i].package_id === mergedArr[k].package_id){ 
 
     isNew = false; 
 
    } 
 
    } 
 
    if(isNew){ 
 
    tempObj.package_id = arr2[i].package_id; 
 
    tempObj.arr2Level = arr2[i].level; 
 
    tempObj.arr1Level = 0; 
 
    mergedArr.push(tempObj); 
 
    tempObj = {}; 
 
    } 
 
} 
 

 
console.log(mergedArr);

+0

親愛的,非常感謝,它的工作原理。而且我也同意其他人認爲應該沒有勺子餵養。但是請相信我,我正在從事一個Ionic2項目,並且編寫了近3500行代碼,無論有沒有幫助。我無法弄清楚這個代碼的邏輯。再次感謝。 – raju

+0

不客氣:) –

1

你既可以陣列第一添加到一個數組,然後使用reduce()forEach()創建對象的新數組。您也可以通過package_id

var arr1 = [{ package_id: 'aabbccdd', level: 2 }, { package_id: 'xycd21', level: 3 }]; 
 
var arr2 = [{ package_id: 'aabbccdd', level: 1 }, { package_id: 'zcb21', level: 5 }]; 
 

 
var o = {} 
 
var arrays = [arr1, arr2] 
 
var keys = Array.from(Array(arrays.length), (e, i) => ({['arr' + (i + 1) + 'Level']: 0})) 
 

 
var result = arrays.reduce(function(r, a, i) { 
 
    a.forEach(function(e) { 
 
    if (!o[e.package_id]) { 
 
     o[e.package_id] = Object.assign({}, {package_id: e.package_id}, ...keys) 
 
     r.push(o[e.package_id]); 
 
    } 
 
    o[e.package_id]['arr' + (i + 1) + 'Level'] = e.level; 
 
    }) 
 
    return r; 
 
}, []) 
 

 
console.log(result)

0

使用另一個目的是組元素,您可以使用針對不同陣列的動態密鑰結構的方法,並使用鍵作爲生成默認值的幫助。

var arr1 = [{ package_id: 'aabbccdd', level: 2 }, { package_id: 'xycd21', level: 3 }], 
 
    arr2 = [{ package_id: 'aabbccdd', level: 1 }, { package_id: 'zcb21', level: 5 }], 
 
    keys = [{ level: 'arr1level' }, { level: 'arr2level' }], 
 
    result = [arr1, arr2].reduce(function (hash) { 
 
     return function (r, a, i) { 
 
      a.forEach(function (b) { 
 
       if (!hash[b.package_id]) { 
 
        hash[b.package_id] = { package_id: b.package_id }, 
 
        r.push(hash[b.package_id]); 
 
       } 
 
       keys.forEach(function (key) { 
 
        Object.keys(key).forEach(function (k) { 
 
         hash[b.package_id][key[k]] = 0; 
 
        }); 
 
       }); 
 
       Object.keys(b).forEach(function (k) { 
 
        var key = keys[i][k] || k; 
 
        hash[b.package_id][key] = b[k]; 
 
       }); 
 
      }); 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

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