2016-12-30 66 views
3

我需要通过公共ID合并多个json对象。我的问题是,我的对象有不同的密钥ID。合并具有不同ID的多个对象数组

var object1 = [ 
    { "name":"apples" ,"w": 1, "x": 2 }, 
    { "name":"banana" ,"w": 1, "x": 2 }, 
    { "name":"cherry" ,"w": 1, "x": 2 }, 
]; 
var object2 = [ 
    { "type":"banana" ,"y": 3, "x": 4 }, 
    { "type":"cherry" ,"y": 3, "x": 4 }, 
]; 

我想获得:

var object1 = [ 
    { "name":"apples" ,"w": 1, "x": 2 }, 
    { "name":"banana" ,"w": 1, "x": 4, "y": 3 }, 
    { "name":"cherry" ,"w": 1, "x": 4, "y": 3 }, 
]; 

我想使用相同的阵列[object1],而不是创建一个新的。 我创建了一个codepen here

+2

如果有什么第二个'object2'将包含少见的水果,比如'{ “类型”: “石灰”, “Y”:2, “X”:4}'?在这种情况下应该是什么结果? – RomanPerekhrest

+0

[合并2对象数组]的可能重复(http://stackoverflow.com/questions/7146217/merge-2-arrays-of-objects) –

回答

2

您可以使用reduce()创建新的数组和发现检查具有相同名称的对象是否存在于相同类型的object2对象中。

var object1 = [ 
 
    { "name":"apples" ,"w": 1, "x": 2 }, 
 
    { "name":"banana" ,"w": 1, "x": 2 }, 
 
    { "name":"cherry" ,"w": 1, "x": 2 }, 
 
]; 
 
var object2 = [ 
 
    { "type":"banana" ,"y": 3, "x": 4 }, 
 
    { "type":"cherry" ,"y": 3, "x": 4 }, 
 
]; 
 

 

 
var result = object1.reduce(function(r, e) { 
 
    var o = object2.find(a => e.name == a.type); 
 
    r.push(o ? Object.assign({}, e, {x: o.x, y: o.y}) : e); 
 
    return r; 
 
}, []) 
 

 
console.log(result)

+0

嘿,你的解决方案工作真棒,我现在的问题是,即不需要.find你知道如何克服吗? –

+0

尝试像这样https://jsfiddle.net/Lg0wyt9u/1435/过滤器 –

2

遍历object2和使用Array.prototype.find更新水果若发现 - 见演示如下:

var object1 = [{ "name":"apples" ,"w": 1, "x": 2 },{ "name":"banana" ,"w": 1, "x": 2 },{ "name":"cherry" ,"w": 1, "x": 2 }]; 
 
var object2 = [{ "type":"banana" ,"y": 3, "x": 4 },{"type":"cherry" ,"y": 3, "x": 4 }]; 
 

 
object2.forEach(function(e){ 
 
    var found = object1.find(function(k){ 
 
    return k.name === e.type; 
 
    }); 
 
    if(found) { 
 
    found.x = e.x; 
 
    found.y = e.y; 
 
    } 
 
}); 
 

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

0

我犯了一个解决你的问题,你可以试试吗?

var object1 = [ 
 
    { "name":"apples" ,"w": 1, "x": 2 }, 
 
    { "name":"banana" ,"w": 1, "x": 2 }, 
 
    { "name":"cherry" ,"w": 1, "x": 2 }, 
 
]; 
 
var object2 = [ 
 
    { "type":"banana" ,"y": 3, "x": 4 }, 
 
    { "type":"cherry" ,"y": 3, "x": 4 }, 
 
]; 
 

 
function mergeObject(obj1,obj2){ 
 
    var obj3 = {}; 
 
    for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; } 
 
    for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; } 
 
    return obj3; 
 
} 
 

 
function mergeObjectInArray(firstArray, firstArrayKey, secondaryArray, secondaryArrayKey) { 
 
    var resultArray = new Array(); 
 
    for(var firstArrayIndex in firstArray) { 
 
    var firstArrayObject = firstArray[firstArrayIndex]; 
 
    var resultArrayObject = firstArrayObject; 
 
    for(var secondaryArrayIndex in secondaryArray) { 
 
    var secondaryArrayObject = secondaryArray[secondaryArrayIndex]; 
 
     if(firstArrayObject[firstArrayKey] === secondaryArrayObject[secondaryArrayKey]) { 
 
     resultArrayObject = mergeObject(firstArrayObject,secondaryArrayObject); 
 
     delete resultArrayObject[secondaryArrayKey]; 
 
     } 
 
    } 
 
    resultArray.push(resultArrayObject); 
 
    } 
 
    return resultArray; 
 
    
 
} 
 

 
var resultArray = mergeObjectInArray(object1, "name", object2, "type"); 
 

 

 
// Assuming JSON.stringify - not available in IE<8 
 
console.log(JSON.stringify(resultArray)); 
 

 

相关问题