admin管理员组

文章数量:1312889

I have two arrays of objects:

Array1:

var myArr1 = [];
myArr1["1"]={any:1,some:1};
myArr1["2"]={any:2,some:2};
myArr1["3"]={any:3,some:3};

Array2:

var myArr2 = [];
myArr2["1"]={other:1};    
myArr2["2"]={other:2};

And I want them to be merged by their keys into a new Attribute, so the result will be:

[
  {any:1,some:1,myNewAttribute:{other:1}},
  {any:2,some:2,myNewAttribute:{other:2}},
  {any:3,some:3,myNewAttribute:{other:3}}
]

I tried to achieve it with lodash's _.merge() but I failed miserably. _.merge only adds the second array after the first, but does not match their keys / ids.

I have two arrays of objects:

Array1:

var myArr1 = [];
myArr1["1"]={any:1,some:1};
myArr1["2"]={any:2,some:2};
myArr1["3"]={any:3,some:3};

Array2:

var myArr2 = [];
myArr2["1"]={other:1};    
myArr2["2"]={other:2};

And I want them to be merged by their keys into a new Attribute, so the result will be:

[
  {any:1,some:1,myNewAttribute:{other:1}},
  {any:2,some:2,myNewAttribute:{other:2}},
  {any:3,some:3,myNewAttribute:{other:3}}
]

I tried to achieve it with lodash's _.merge() but I failed miserably. _.merge only adds the second array after the first, but does not match their keys / ids.

Share Improve this question edited Sep 1, 2016 at 12:52 user663031 asked Sep 1, 2016 at 12:37 Manuel SchillerManuel Schiller 3,2374 gold badges18 silver badges17 bronze badges 14
  • 1 Is this pseudo code? Javascript has objects, not dicts. What exactly didn’t work for you with _.merge? – Misha Reyzlin Commented Sep 1, 2016 at 12:40
  • 1 Looking at your desired result, the first element has a some property, but not the second or third? Is that really what you want, or do you want the some property on all elements in the result? – user663031 Commented Sep 1, 2016 at 12:47
  • i edited the question. I know how to manually bine them with a for-loop, but I wanted to keep it elegant with lodash.. – Manuel Schiller Commented Sep 1, 2016 at 12:48
  • 1 You know that array["1"] is equivalent to array[1], right? Are you intending to skip over the 0 index, by the way? – user663031 Commented Sep 1, 2016 at 12:53
  • 1 @ManuelSchiller ... regarding yours "... but I wanted to keep it elegant with lodash ..." - if it is about elegance, just pick the right tool. In your case it should be an arrays native reduce method. (And in case of having to use lodash mandatory, choose its reduce instead of its merge method.) – Peter Seliger Commented Sep 1, 2016 at 13:23
 |  Show 9 more ments

5 Answers 5

Reset to default 3

You could map the second array to a new property and merge later.

With lodash

var data1 = [{ any: 1, some: 1 }, { any: 2, some: 2 }, { any: 3, some: 3 }],
    data2 = [{ other: 1 }, { other: 2 }, { other: 3 }];

console.log(_.merge(data1, _.map(data2, x => ({ myNewAttribute: x }))));
<script src="https://cdnjs.cloudflare./ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

With ES6, without lodash

var data1 = [{ any: 1, some: 1 }, { any: 2, some: 2 }, { any: 3, some: 3 }],
    data2 = [{ other: 1 }, { other: 2 }, { other: 3 }];

console.log(data1.map((a, i) => Object.assign({}, a, { myNewAttribute: data2[i] })));

You don't need lodash:

myArr1.map((e1, idx) => Object.assign({}, e1, {myNewAttribute: myArr2[idx]}))

You could get fancy and write a little function called map2, which takes two arrays, and invokes a callback with the two elements:

function map2(a1, a2, fn) {
  return a1.map((elt, idx) => fn(elt, a2[idx]);
}

Now you can write the solution as

map2(myArr1, myArr2, (e1, e2) => Object.assign({}, e1, {myNewAttribute: e2}))

From the perspective of program design, what we are doing here is "separating concerns". The first concern is the abstract operation of looping over two arrays in parallel and doing something with each pair of elements. That is what is represented by map2. The second concern is the specific way you want to bine the elements. That is what is represented by the function we are passing to map2. This could be made clearer and somewhat self-documenting by writing it separately:

function bineObjects(e1, e2) { 
  return Object.assign({}, e1, {myNewAttribute: e2}); 
}

map2(myArr1, myArr2, bineObjects);

Of course, in the real world, you'd want to handle the case where the two arrays were of different length, pass an index to the callback as a third parameter for use if necessary, support a third thisArg-type parameter analogous to map, etc.

You can do like this:

var first = [{any:1,some:1},{any:2,some:2},{any:3,some:3}];
var second = [{other:1},{other:2},{other:3}];

for(var i = 0; i < first.length; i++){
    if(first[i] && second[i]){
         first[i]['mycustomitem'] = second[i];
    }
}

console.log(first);

In order to prove, what I did ment 30 minutes ago - How to merge two dictionaries in javascript - there is a possible reduce approach ...

... firstly provided as lodash based example ...

var
    myArr1 = [
        {any: 1, some: 1},
        {any: 2, some: 2},
        {any: 3, some: 3}
    ],
    myArr2 = [
        {other: 1},
        {other: 2}
    ],

    mergedObjectList = _.reduce(myArr1, function (collector, item_1, idx) {
        var
            item_2 = collector[idx],
            merger = _.assign({}, item_1, item_2);

        // or whatever one wants to do to `merger` with `myNewAttribute`

        collector[idx] = merger;

        return collector;

    }, _.clone(myArr2));


console.log("myArr1 : ", myArr1);
console.log("myArr2 : ", myArr2);
console.log("mergedObjectList : ", mergedObjectList);
<script src="https://cdnjs.cloudflare./ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

... and secondly as language core only based example ...

var
    myArr1 = [
        {any: 1, some: 1},
        {any: 2, some: 2},
        {any: 3, some: 3}
    ],
    myArr2 = [
        {other: 1},
        {other: 2}
    ],

    mergedObjectList = myArr1.reduce(function (collector, item_1, idx) {
        var
            item_2 = collector[idx],
            merger = Object.assign({}, item_1, item_2);

        // or whatever one wants to do to `merger` with `myNewAttribute`

        collector[idx] = merger;

        return collector;

    }, Array.from(myArr2));


console.log("myArr1 : ", myArr1);
console.log("myArr2 : ", myArr2);
console.log("mergedObjectList : ", mergedObjectList);

Try this function:

function mergeDictionary(_dctn1,_dctn2)
{
   var newDict = [];
   for(var i in _dctn1)
   {
       newDict[i] = _dctn1[i];
   }
   for(var j in _dctn2)
   {
       if(newDict[j] == undefined)
       {
            newDict[j] = _dctn2[j];
       }
       else
       {
            for(var k in _dctn2[j])
            {
                newDict[j][k] = _dctn2[j][k]; 
            }
       }
   
   }
   
   return newDict;
}


var myArr1 = [];
myArr1["1"]={any:1,some:1};
myArr1["2"]={any:2,some:2};
myArr1["3"]={any:3,some:3};

var myArr2 = [];
myArr2["1"]={other:1};    
myArr2["2"]={other:2};

console.log(mergeDictionary(myArr1, myArr2));

本文标签: dictionaryHow to merge two dictionaries in javascriptStack Overflow