Estoy tratando de fusionar dos objetos en uno (obj1 y obj2 en objResult):

var obj1 = {
 0: [{obj1key1: 'obj1value1'}, {obj1key2: 'obj1value2'}],
 1: [{obj1key3: 'obj1value3'}, {obj1key4: 'obj1value4'}],
 2: [{obj1key5: 'obj1value5'}, {obj1key6: 'obj2value6'}]
};
var obj2 = {
 0: [{obj2key1: 'obj2value1'}, {obj2key2: 'obj2value2'}],
 1: [{obj2key3: 'obj2value3'}, {obj2key4: 'obj2value4'}],
 2: [{obj2key5: 'obj2value5'}, {obj2key6: 'obj2value6'}]};
var objResult = {
 0: {
   0: [{obj1key1: 'obj1value1'}, {obj1key2: 'obj1value2'}],
   1: [{obj2key1: 'obj2value1'}, {obj2key1: 'obj2value1'}]
 },
 1: {
   0: [{obj1key3: 'obj1value3'}, {obj1key4: 'obj1value4'}],
   1: [{obj2key3: 'obj2value3'}, {obj2key4: 'obj2value4'}]
 },
 2: {
   0: [{obj1key5: 'obj1value5'}, {obj1key6: 'obj1value6'}],
   1: [{obj2key5: 'obj2value5'}, {obj2key6: 'obj2value6'}]
 }
}

Probé las funciones de combinación de jQuery y lodash pero sin éxito. ¿Podría aconsejar la mejor manera de fusionar estos dos objetos en uno? Ya sea con JS simple o jquery / lodash.

0
user3599444 10 dic. 2015 a las 20:35

3 respuestas

La mejor respuesta

Itere sobre las claves en uno de los objetos, y para cada uno, configure esa clave en el objeto resultante en un objeto que contenga los valores de ambos objetos originales.

function merge(obj1, obj2) {
    var objResult = {};

    Object.keys(obj1).forEach(function(key) {
        objResult[key] = {
            0: obj1[key],
            1: obj2[key]
        }
    })

    return objResult;
}

Esto supone que ambos objetos tienen el mismo conjunto de claves. Si no lo hacen, puede iterar sobre las claves de ambos objetos, y esto establecerá indefinido como el valor cuando ese objeto no contenga esa clave.

Demo

1
James Brierley 10 dic. 2015 a las 17:46

Aquí hay un ejemplo simple de JS que puede administrar objetos con diferentes tamaños.

var obj1 = {
 0: [{obj1key1: 'obj1value1'}, {obj1key2: 'obj1value2'}],
 1: [{obj1key3: 'obj1value3'}, {obj1key4: 'obj1value4'}],
 2: [{obj1key5: 'obj1value5'}, {obj1key6: 'obj2value6'}]
};
var obj2 = {
 0: [{obj2key1: 'obj2value1'}, {obj2key2: 'obj2value2'}],
 1: [{obj2key3: 'obj2value3'}, {obj2key4: 'obj2value4'}],
 2: [{obj2key5: 'obj2value5'}, {obj2key6: 'obj2value6'}]};

var obj3 = [obj1, obj2].reduce(function(result, obj, objNum){
  return Object.keys(obj).reduce(function(result, k){
    result[k] = result[k] || {};
    result[k][objNum] = obj[k];
    return result;
  }, result);
}, {});

console.log(obj3);
1
Quentin Roy 10 dic. 2015 a las 17:55

Suponiendo que los dos objetos son del mismo tamaño (longitud)

var obj1 = {
 0: [{obj1key1: 'obj1value1'}, {obj1key2: 'obj1value2'}],
 1: [{obj1key3: 'obj1value3'}, {obj1key4: 'obj1value4'}],
 2: [{obj1key5: 'obj1value5'}, {obj1key6: 'obj2value6'}]
};
var obj2 = {
 0: [{obj2key1: 'obj2value1'}, {obj2key2: 'obj2value2'}],
 1: [{obj2key3: 'obj2value3'}, {obj2key4: 'obj2value4'}],
 2: [{obj2key5: 'obj2value5'}, {obj2key6: 'obj2value6'}]};

var result = {};
_.each(obj1, function(obj, key){
   result[key] = [];
   result[key].push(obj);
   result[key].push(obj2[key]);    
});

$('body').append('<pre><code>' + JSON.stringify(result) + '</code></pre>');
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://lodash.com/_js/lodash.js"></script>

Por supuesto, si tiene varias longitudes, debe iterar en la más grande y realizar un seguimiento del tamaño.

1
AhmadAssaf 10 dic. 2015 a las 17:46
34208283