2014-11-28 5 views
0

У меня есть объект JS позволяет сказать JSon 1Как объединить два JS объекты

[ 
    { 
     "id": "123", 
     "testname": "test123", 
     "name": "John Doe", 
     "active": true, 
     "type": "test6" 
    } 

{ 
     "id": "456", 
     "testname": "test564", 
     "name": "Ship Therasus", 
     "active": true, 
     "type": "test7" 
    } 

.... some 100 entries 
] 

и JSON 2 некоторые, как показано ниже

[ 
    { 
     "id": "123", 
     "country": "USA", 
     "state": "KA", 
     "age": 24, 
     "group": "g1" 
    } 

{ 
     "id": "456", 
     "country": "UK", 
     "state": "MA", 
     "age": 28, 
     "group": "G2" 
    } 

...... 100 entries 
] 

Теперь Id постоянная вещь между json1 и json2 Я хочу для создания результирующего объекта что-то вроде ниже позволяет вызвать json3. Я хочу сопоставить идентификатор и получить страну и состояние от json2 и добавить к json 1. Как я могу это сделать с помощью JavaScript?

[ 
    { 
     "id": "123", 
     "testname": "test123", 
     "name": "John Doe", 
     "active": true, 
     "type": "test6", 
     "country":"USA", 
     "state":"KA" 
    } 

{ 
     "id": "456", 
     "testname": "test564", 
     "name": "Ship Therasus", 
     "active": true, 
     "type": "test7", 
     "country":"UK", 
     "state":"MA" 
    } 
] 
+0

Если вы можете полагаться на индексы массива, которые Matching, вы могли бы взять просто поместить эти два массива в качестве элементов третьего массива и использовать '.zip' Underscore в или реализовать что-то подобное. http://underscorejs.org/#zip – Hrishi

+0

Являются ли элементы в том же порядке для обоих массивов? – plalx

ответ

1

Примечание: Если вы предпочитаете jQuery.

Использование $ .extend() вы можете объединить один или несколько объектов в первый. Существует много способов использовать $ .extend(), который решает разные сценарии. Ваши совпадения соответствуют следующему, где у вас есть два объекта с некоторыми общими и разными свойствами. Как вы хотите, чтобы объединить их обоих в один объект, и вы также хотите, чтобы все необычные свойства обоих объектов, чтобы быть там вам нужно сделать это так,

var firstData = [ 
    { 
     "id": "123", 
     "testname": "test123", 
     "name": "John Doe", 
     "active": true, 
     "type": "test6" 
    }, 

    { 
     "id": "456", 
     "testname": "test564", 
     "name": "Ship Therasus", 
     "active": true, 
     "type": "test7" 
    } 
]; 

var secondData = [ 
    { 
     "id": "123", 
     "country": "USA", 
     "state": "KA", 
     "age": 24, 
     "group": "g1" 
    }, 

{ 
     "id": "456", 
     "country": "UK", 
     "state": "MA", 
     "age": 28, 
     "group": "G2" 
    } 
]; 

// This will remove the properties that you don't want to be in the merged object 
$.each(secondData, function(index, object){ 
    $.each(object, function(key, value){ 
     if(key == "age"){ 
      delete secondData[index][key]; 
     } 
     else if(key == "group"){ 
      delete secondData[index][key]; 
     } 
    }); 
}); 

// this is to merge the objects 
$.extend(true, firstData, secondData); 

// check your console 
console.log(firstData); 

Что .extend() делает объединяет оба объекта и сохраняет их в первом объекте. Первый аргумент true указывает, что объект будет рекурсивно сливаться.

jsFiddle

Ссылки:$.extend()

+0

OP хочет использовать Javascript not jQuery –

+0

Нужны ли объекты в двух массивах в одном порядке? – Sin

2

Если вы используете JQuery, вы можете сделать это следующим образом:

var json1 = [{id:1, one: 1}, {id:2, one: 2}]; 
var json2 = [{id:1, two: 1}, {id:2, two: 2}]; 

var merged = $.map(json1, function(v1, i) { 
    var result = $.extend({}, v1); 
    var v2s = $.grep(json2, function(v2) { 
    return v2.id === v1.id; 
    }); 
    for (var i = v2s.length - 1; i >= 0; i--) { 
    $.extend(result, v2s[i]); 
    }; 
    return result; 
}); 

не версия JQuery:

var merged = []; 
for (var i = json1.length - 1; i >= 0; i--) { 
    var v1 = json1[i]; 
    var result = {}; 
    for (var key in v1) { 
    if (v1.hasOwnProperty(key)) { 
     result[key] = v1[key]; 
    } 
    } 
    for (var j = json2.length - 1; j >= 0; j--) { 
    var v2 = json2[j]; 
    if (v1.id === v2.id) { 
     for (var key in v2) { 
     if (v2.hasOwnProperty(key)) { 
      result[key] = v2[key]; 
     } 
     } 
    } 
    } 
    merged.push(result); 
}; 
Смежные вопросы