2016-04-27 4 views
0

У меня есть 2 JavaScript массив объектов в следующем формате:Группировка в объект массива

var input1 = 
    { 
     "a" : [ 
     { 
     "id" : 1, 
     "name" : "gh" 
     }], 
     "b" : [ 
     { 
     "id" : 2, 
     "name" : "ab" 
     }] 

    } 

var input2 = 
{ 
"a" : [ 
     { 
     "id" : 3, 
     "name" : "cd" 
     }], 
     "b" : [ 
     { 
     "id" : 4, 
     "name" : "gh" 
     }] 
} 

Я ищу отформатировать его следующим образом:

var finaloutput = 
    { 
     "a" : [ 
     { 
     "id" : 1, 
     "name" : "gh" 
     }, 
     { 
     "id" : 3, 
     "name" : "cd" 
     } 
     ], 
     "b" : [ 
     { 
     "id" : 2, 
     "name" : "ab" 
     }, 
     { 
     "id" : 4, 
     "name" : "gh" 
     } 
     ]  
    } 

Я пытаюсь группы в массив без использования каких-либо внешних библиотек. Не очень знакомы с linq в javascript, какие-либо встроенные функции или любые ссылки?

Edit: Я сделал изменения входов, так это то, что я ожидал как входы

+2

Ваш первый блок не держит то, что вы думаете, что делает, первый '» свойства '', '" b "' будут перезаписаны вторым набором. Поэтому его просто будет '{a: [{id: 3}], b: [{id: 4}]}' –

+0

ваш объект повторно инициализирует ключи. –

ответ

2

Try это, конечно, это просто быстрый РЕАЛИЗАЦИЯ - но это должно установить Вас на правильном пути:

var finaloutput = Object.keys(input1).reduce((p,v) => { 
    p[v] = (input1[v].concat(input2[v])) 
    return p; 
}, {}) 

возвращается =>

JSON.stringify (finaloutput, нуль, 2);

"{ 
    "a": [ 
    { 
     "id": 1, 
     "name": "gh" 
    }, 
    { 
     "id": 3, 
     "name": "cd" 
    } 
    ], 
    "b": [ 
    { 
     "id": 2, 
     "name": "ab" 
    }, 
    { 
     "id": 4, 
     "name": "gh" 
    } 
    ] 
}" 
1

Создайте карту и заполнить его проверки ключа существования, с любым заданным числом входов

var allInputs = []; 
allInputs.push(input1); 
allInputs.push(input2); 

var result = []; 

for(var x in allInputs) 
{ 
    var inp = allInputs[x]; 
    for(var i in inp) 
    { 
     if(result[i] == undefined) 
     { 
      result[i] = []; 
     } 

     result[i].push(inp[i]); 
    } 
} 
0
var finalOutput; 
    var input1 = { 
      "a": [{ 
        "id": 1, 
        "name": "gh" 
      }], 
      "b": [{ 
        "id": 2, 
        "name": "ab" 
      }] 
    }; 

    var input2 = { 
      "a": [{ 
        "id": 3, 
        "name": "cd" 
      }], 
      "b": [{ 
        "id": 4, 
        "name": "gh" 
      }] 
    }; 
    input1.a.push(input2.a[0]); 
    input1.b.push(input2.b[0]); 
    finalOutput = input1; 

    //////////////////////////////////////////////////////  
    If the arrays are dynamic you can do the operation as follows: 

    var input1 = { 
     "a": [ 
      { 
       "id": 1, 
       "name": "gh" 
      } 
     ], 
     "b": [ 
      { 
       "id": 2, 
       "name": "ab" 
      } 
     ] 
} 

var input2 = { 
     "a": [ 
      { 
       "id": 3, 
       "name": "cd" 
      } 
     ], 
     "b": [ 
      { 
       "id": 4, 
       "name": "gh" 
      } 
     ] 
} 
var inputNewLengthA = input1.a.length; 
var inputNewLengthB = input1.b.length; 
var finalOutput; 
for(var v=0;v<inputNewLengthA;v++){ 
    input1.a.push(input2.a[v]); 
} 
for(var n=0;n<inputNewLengthB;n++){ 
    input1.b.push(input2.b[n]); 
} 
finalOutput = input1; 
/////////////////////////////////////// 
Note: You can also use one for loop only if your array lengths are 
equal. 
Смежные вопросы