2017-04-07 65 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; }