0

I have an array in this format,

var users = [{name:"user1"}, {name:"user2"}, {name:"user3"}];
var regular = [{regular:"100"}, {regular:"200"}, {regular:"300"}];
var overtime = [{overtime:"150"}, {overtime:"250"}, {overtime:"300"}];

I want to merge it by it's index and add it as user's property,

like this as an output,

users = [
           {name:"user1",  earnings: [{regular:"100", overtime:"150"}]}, 
           {name:"user2",  earnings: [{regular:"200", overtime:"250"}]},
           {name:"user3",  earnings: [{regular:"300", overtime:"350"}]}  
        ];

what I did was

$.each(users, function(aa,bb){
            /* Merge Regular Amount  */
            $.each(regular, function(cc,dd){
                if(aa == cc)
                {
                    users[aa].earnings = dd; // change to label of earnings 
                }
            });

            /* Merge Overtime Amount  */
            $.each(overtime, function(cc,dd){
                if(aa == cc)
                {
                    users[aa].earnings = dd; // change to label of earnings 
                }
            });
});

however I'm only getting the overtime property, seems like it gets overwritten, Can someone help me or guide me to get the expected output, thank you,

apelidoko
  • 782
  • 1
  • 7
  • 23

4 Answers4

3

You can use .map for this.

var users = [{name:"user1"}, {name:"user2"}, {name:"user3"}];
var regular = [{regular:"100"}, {regular:"200"}, {regular:"300"}];
var overtime = [{overtime:"150"}, {overtime:"250"}, {overtime:"300"}];

var result = users.map(function(v, i) {
  return {
    name: v.name,
    earnings: [{
      regular: regular[i].regular,
      overtime: overtime[i].overtime
    }]
  };
});

console.log(result);

If earnings is just an object and not an array

var users = [{name:"user1"}, {name:"user2"}, {name:"user3"}];
var regular = [{regular:"100"}, {regular:"200"}, {regular:"300"}];
var overtime = [{overtime:"150"}, {overtime:"250"}, {overtime:"300"}];

var result = users.map(function(v, i) {
  return {
    name: v.name,
    earnings: {
      regular: regular[i].regular,
      overtime: overtime[i].overtime
    }
  };
});

console.log(result);

Doc: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Eddie
  • 26,593
  • 6
  • 36
  • 58
1

You could collect all properties at the same index for earnings.

Object.assign takes the first given object and assigns all properties of the second and following parameters to the first object and returns that object (which is not necessary here).

At the first part an object is assigne if the earning poperty does not exist.

Object.assign(users[i].earnings = users[i].earnings || {}, o)

              users[i].earnings = users[i].earnings || {}      assigns object if not exist

var users = [{ name: "user1" }, { name: "user2" }, { name: "user3" }],
    regular = [{ regular: "100" }, { regular: "200" }, { regular: "300" }],
    overtime = [{ overtime: "150" }, { overtime: "250" }, { overtime: "300" }];

[regular, overtime].forEach(a =>
     a.forEach((o, i) =>
         Object.assign(users[i].earnings = users[i].earnings || {}, o)));

console.log(users);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
  • can you explain me in few words how object.assign works, Object.assign(users[i].earnings = users[i].earnings || {}, o))); just for a little explanation, thank you foryour help, – apelidoko Feb 14 '18 at 09:50
0

Try this code

var users = [{name:"user1"}, {name:"user2"}, {name:"user3"}];
var earnings = [];
var regular = [{regular:"100"}, {regular:"200"}, {regular:"300"}];
var overtime = [{overtime:"150"}, {overtime:"250"}, {overtime:"300"}];

var finalResult =[];
users.map(function(v, i) {
  finalResult.push({
    name: v.name,
    earnings: {
      regular: regular[i].regular,
      overtime: overtime[i].overtime
    }
    })
});

console.log(finalResult);
Libin C Jacob
  • 1,108
  • 12
  • 34
0

Simpliest way:

users = users.map((user, i) => {
    user.earnings = [{
        ...regular[i],
        ...overtime[i],
    }]
})
Sergio
  • 1,370
  • 11
  • 12