2015-11-11 2 views
0

array1 имеет родительский элемент с дочерними элементами. В массиве array2 осталось несколько других родителей. Array1 дети должны быть заменены на детей в массив2Переопределить значение элемента массива путем сопоставления с другим массивом javascript

array1:

{ 
    "name": "USA", 
    "id": "country: USA", 
    "children": [ 
     { 
      "name": "chicago", 
      "id": "country:USA>chicago" 
     }, 
     { 
      "name": "arizona", 
      "id": "country:USA>arizona" 
     }, 
     { 
      "name": "alabama", 
      "id": "country:USA>alabama" 
     } 
    ] 
}, 

    { 
     "name": "xyz", 
     "id": "country:xyz", 
     "children": [ 
      { 
       "name": "name1", 
       "id": "country:xyz>name1" 
      }, 
      { 
       "name": "name2", 
       "id": "country:xyz>name2" 
      } 
     ] 
    }, 
    { 
     "name": "abc", 
     "id": "country:abc", 
     "children": [ 
      { 
       "name": "name1", 
       "id": "country:abc>abc1" 
      }, 
      { 
       "name": "name2", 
       "id": "country:abc>abc2" 
      } 
     ] 
    } 

array2:

[ 
{ 
    "name": "name3", 
    "id": "country:xyz>name1" 
}, 
{ 
    "name": "georgia", 
    "id": "country:USA>georgia" 
}, 
{ 
    "name": "name4", 
    "id": "country:xyz>name4" 
} 

]

Результат:

[ 
{ 
    "name": "USA", 
    "id": "country:USA", 
    "children": [ 
     { 
      "name": "georgia", 
      "id": "country:USA>georgia" 
     } 
    ] 
}, 
{ 
    "name": "xyz", 
    "id": "country:xyz", 
    "children": [ 
     { 
      "name": "name3", 
      "id": "country:xyz>name1" 
     }, 
     { 
      "name": "name4", 
      "id": "country:xyz>name4" 
     } 
    ] 
}, 
{ 
    "name": "abc", 
    "id": "country:abc", 
    "children": [ 
     { 
      "name": "name1", 
      "id": "country:abc>abc1" 
     }, 
     { 
      "name": "name2", 
      "id": "country:abc>abc2" 
     } 
    ] 
} 

]

Код, который я пробовал, но не работал. Проблема с моим кодом заключается в том, что я возвращаю массив1 как есть, тогда как я ожидаю, что array2 найдет его родительский элемент в массиве1. В тот момент, когда он находит родителя, он должен заменить дочерние элементы массива array1 на данные массива.

for (var j = 0; j < array2.length; j++) { 
var parentId = array2[j].id.substr(0, array2[j].id.indexOf('>')); 
for(var k=0; k < array1.length; k++){ 
    if(parentId == array1[k].id){ 
     if(array2[j].id.indexOf(array1[k].children.id) > -1){ //found a match 
      array1[k].children = []; 
      array1[k].children.push(array2[j]); 
     } 
    } 
} 

}

+0

Не могли бы вы сделать ваши массивы немного более удобным для чтения? И, может быть, более подробно описать, что не работает в коде, который вы нам дали? Кстати, у вашего массива есть некоторые ошибки копирования/вставки, так как половина двойных кавычек отсутствует: D – Icepickle

+0

@Icepickle: Я отредактировал свой вопрос, чтобы сделать его более читаемым. Проблема с моим кодом заключается в том, что я возвращаю массив1 как есть тогда как я ожидаю, что массив2 найдет своего родителя в массиве1. В тот момент, когда он находит родителя, он должен заменить дочерние элементы массива array1 на данные массива. Надеюсь, теперь я ясно. – Mustang

+0

Когда вы проверяете 'parentId == array1 [k] .id' parentId = 'страна: xyz' и array1 [1] .id = 'страна: xyz'. быть в курсе пространства ... – Ziki

ответ

0

Я предлагаю построить временный объект с ключами для сгруппированных элементов, а затем перебрать array1 и если свойство id находится в temp объекта, а затем заменить содержание имущества children с новым контентом.

var array1 = [{ "name": "USA", "id": "country:USA", "children": [{ "name": "chicago", "id": "country:USA>chicago" }, { "name": "arizona", "id": "country:USA>arizona" }, { "name": "alabama", "id": "country:USA>alabama" }] }, { "name": "xyz", "id": "country:xyz", "children": [{ "name": "name1", "id": "country:xyz>name1" }, { "name": "name2", "id": "country:xyz>name2" }] }, { "name": "abc", "id": "country:abc", "children": [{ "name": "name1", "id": "country:abc>abc1" }, { "name": "name2", "id": "country:abc>abc2" }] }], 
 
    array2 = [{ "name": "name3", "id": "country:xyz>name1" }, { "name": "georgia", "id": "country:USA>georgia" }, { "name": "name4", "id": "country:xyz>name4" }]; 
 

 
function f() { 
 
    var temp = {}; 
 
    array2.forEach(function (a) { 
 
     var key = /(country:.*)>/i.exec(a.id)[1]; 
 
     temp[key] = temp[key] || []; 
 
     temp[key].push(a); 
 
    }); 
 
    array1.forEach(function (a) { 
 
     if (a.id in temp) { 
 
      a.children = temp[a.id]; 
 
     } 
 
    }); 
 
} 
 

 
f(); 
 
document.write('<pre>' + JSON.stringify(array1, 0, 4) + '</pre>');

+1

Спасибо Нине. Очень элегантное решение. – Mustang

Смежные вопросы