2015-08-06 3 views
0

Я начинаю javascript. Мне нужно объединить два массива, которые содержат объекты, которые, в свою очередь, содержат массивы.Объединить вложенные массивы в Javascript

У меня есть два массива

arr1[ 
    { 
     description : "this is a object", 
     array  : [a.x,"b"] 
    } 
] 

arr2[ 
    { 
     array : [a.z,"b","c","d"]    
    } 
] 

я использовал следующий код для выполнения слияния

function arrayUnique(array) { 
    var a = array.concat(); 
    for(var i=0; i<a.length; ++i) { 
     for(var j=i+1; j<a.length; ++j) { 
      if(a[i] === a[j]) 
       a.splice(j--, 1); 
     } 
    } 

    return a; 
} 
function combine(obj1,obj2) { 
    var res = {}; 
    for (var k1 in obj1) { 
     if (!obj1.hasOwnProperty(k1)) continue; 
     if (obj2.hasOwnProperty(k1)) { // collision 
      if (typeof(obj1[k1]) !== typeof(obj2[k1])) throw "type mismatch under key \""+k1+"\"."; 
      if (Array.isArray(obj1[k1])) { 
       res[k1] = obj1[k1].concat(obj2[k1]); 
      } else if (typeof(obj1[k1]) === 'string' || obj1[k1] instanceof String) { 
       res[k1] = arrayUnique(obj1[k1].concat(obj2[k1])); 
      } else if (typeof(obj1[k1]) === 'object') { 
       res[k1] = combine(obj1[k1],obj2[k1]); 
      } else { 
       throw "unsupported collision type "+typeof(obj1[k1])+" under key \""+k1+"\"."; 
      } 
     } else { 
      res[k1] = obj1[k1]; 
     } 
    } 
    for (var k2 in obj2) { 
     if (!obj2.hasOwnProperty(k2)) continue; 
     if (obj1.hasOwnProperty(k2)) continue; // already handled it above 
     res[k2] = obj2[k2]; 
    } 
    return res; 
} 

var res = combine(arr1,arr2); 

Это результат я ожидал

res = { description : "this is a object", array : [a.x,a.z,"b","c","d"] } 

Но, к сожалению, это результате я получаю

res = { description : "this is a object", array : [a.x,"b","c","d"]} 

a.z является пропущенным.

+0

Посмотрите здесь http://stackoverflow.com/questions/7146217/merge-2-arrays-of-objects, возможно, это помогает. –

ответ

0

Когда оба объекта имеют одинаковые поля массива вы их конкатенацию (concat добавить два массива один за другим), здесь:

if (Array.isArray(obj1[k1])) { 
    res[k1] = obj1[k1].concat(obj2[k1]); 

Если вместо ["a","a","b","b","c","d"] вы хотите получить ["a","b","c","d"] вам необходимо выполнить массив объединить вручную.

Проверьте это answer на несколько способов слияния массивов без дубликатов.

+0

Спасибо, я смог решить проблему дублирования. Но если у моего массива есть свойство, родитель которого тот же, но свойство другое, мое слияние, похоже, не работает должным образом. Попросите вас прочитать мой отредактированный вопрос. Не могли бы вы помочь. – qualitytest

+0

Что такое a.x и a.z? Если они являются переменными, arrayUnique проверяет, только если они имеют одинаковое значение ... Каково текущее значение a.x e a.z? –

+0

Да, они имеют одинаковое значение. Я понял. Спасибо :) – qualitytest

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