2017-01-12 4 views
0

Я пытаюсь слить два json в один json. Я не хочу объединять все ключи, я добавил свой код. Код должен быть в javascript или узле (подчеркивание).javascript + объединить массивы json на основе ключа,

var json1 = [{user_id:1,friend_id:2,desc:'aaa'}, {user_id:3,friend_id:4,desc:'ccc'}, {user_id:1,friend_id:1,desc:'ccc'} , {user_id:1,friend_id:3,desc:'ccc'} ]; 


var json2 = [{reference_id:1,name:'A'},{reference_id:2,name:'B'},{reference_id:3,name:'C',age:30},{reference_id:4,name:'D'}]; 

Ожидая выхода:

выход:

json1 = [{user_id:1,friend_id:2,desc:'aaa',user_name:'A',friend_name:'B'}, {user_id:3,friend_id:4,desc:'ccc',user_name:'C',friend_name:'D'}, {user_id:1,friend_id:1,desc:'ccc',user_name:'A',friend_name:'A'} , {user_id:1,friend_id:3,desc:'ccc',user_name:'A',friend_name:'C'} ]; 

Logic Js Код:

for (var i = 0; i < json1.length; i++) { 
    var user_id = json1[i].user_id; 
    var friend_id = json1[i].friend_id; 
    for (var j = 0; j < json2.length; j++) { 
     if (json2[j].reference_id == user_id) { 
      json1[i].user_name = json2[j].name; 
     } 
     if (json2[j].reference_id == friend_id) { 
      json1[i].friend_name = json2[j].name; 
     } 
    } 
} 

Я приложил свой код в jsfiddle. Click Here

Этот же код следует преобразовать в символ подчеркивания.

+1

я первый перенастроить второй массив в качестве объекта с ключами от * идентификаторСсылки * и значения * имя *, то это просто итерации над первым массивом, чтобы увеличить данные. Обратите внимание, что «JSON» - это обозначение, которое заимствовано из текстовой нотации ECMAScript. У вас есть массивы и объектные литералы, а не «JSON». – RobG

+0

@ RobG - почему вы удалили свой код. pls вывешивает его. я проверю – RSKMR

+0

Вы должны уметь видеть удаленные сообщения, это по сути то же самое, что и у Часа Брауна. – RobG

ответ

2

Вы повторяете некоторое усилие здесь. Не имеет значения, если длина json2.length мала; но если он большой, вы заплатите штраф: вы перебираете каждый элемент json2 каждый раз, когда вы смотрите на элемент json1. Поэтому вместо того, думать об этом так:

var personMap = {}; 
json2.forEach(function(item) { 
    personMap[item.reference_id] = item.name; 
}); 

json1.forEach(function(item) { 
    item.user_name = personMap[item.user_id]; 
    item.friend_name = personMap[item.friend_id]; 
}); 
+0

Snap ............ – RobG

+0

@RobG: Бесконечная гонка :) –

+0

Единственные отличия я использовал * уменьшить *, а не * для Each * и проверить, существует ли первое имя, но, вероятно, это не требуется. До OP все равно. – RobG

1

Ваш код в простой ванили JS должен работать, за исключением «==» в местах, где вы ошибочно положили «=».

Заменить эти:

if (json2[j].reference_id = user_id) { 
... 
if (json2[j].reference_id = friend_id) { 
... 

с этим:

if (json2[j].reference_id == user_id) { 
... 
if (json2[j].reference_id == friend_id) { 

Попробуйте это подчеркиванием:

_.map(json1, function(item){ 
    var user_id = item.user_id; 
    var friend_id = item.friend_id; 

    _.map(json2, function(item2){ 

    if (item2.reference_id == user_id) { 
     item.user_name = item2.name; 
     } 
    if (item2.reference_id == friend_id) { 
     item.friend_name = item2.name; 
    } 
}); 


}); 
+0

О боже. Да, я пропустил ==. Благодарю. Это моя вина. – RSKMR

+0

Его возможное использование подчеркивания. Я добавлю для вас голосование, потому что я сделал свою ошибку, вы это нашли. – RSKMR

+0

Я обновляю свой вопрос. – RSKMR