比较两个对象数组,并将新属性添加到匹配的对象

时间:2016-10-23 01:53:00

标签: javascript arrays object

我有两个这样的对象数组:

let data1 = [ { userid_b: 'dan12345' }, { userid_b: 'emma12345' } ]
let data2 =[ 
  { username: 'dan', userid: 'dan12345' },
  { username: 'johndoe', userid: 'john12345' },
  { username: 'emma', userid: 'emma12345' },
  { username: 'Bob', userid: 'bob12345' },
  { username: 'Sam', userid: 'sam12345' } 
]

我想比较这两个userid_buserid,如果它们相同,我想向data2添加一个新属性。

所以我想要这样的结果:

let data2 =[ 
  { username: 'dan', userid: 'dan12345', newAttribute: true },
  { username: 'johndoe', userid: 'john12345' },
  { username: 'emma', userid: 'emma12345', newAttribute: true },
  { username: 'Bob', userid: 'bob12345' },
  { username: 'Sam', userid: 'sam12345' } 
]

我怎样才能做到这一点?

6 个答案:

答案 0 :(得分:1)

循环两个数组并比较值,必要时进行分配:



var data1 = [
  { userid_b: 'dan12345' },
  { userid_b: 'emma12345' }
];

var data2 = [ 
  { username: 'dan', userid: 'dan12345' },
  { username: 'johndoe', userid: 'john12345' },
  { username: 'emma', userid: 'emma12345' },
  { username: 'Bob', userid: 'bob12345' },
  { username: 'Sam', userid: 'sam12345' } 
];

// Loop the main array
for (var i = 0; i < data2.length; i++) {
  // Loop the second array
  for (var j = 0; j < data1.length; j++) {
    // If the user id matches
    if (data2[i].userid == data1[j].userid_b) {
      // Add the attribute
      data2[i].newAttribute = true;
      // Break out of the the 'j' loop to stop unnecessary iterations
      break;
    }
  }
}

console.log(data2);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

new Map()转换为data2,然后只要userid在地图中添加newAttribute道具,就会迭代const data1 = [ { userid_b: 'dan12345' }, { userid_b: 'emma12345' } ] const data2 =[ { username: 'dan', userid: 'dan12345' }, { username: 'johndoe', userid: 'john12345' }, { username: 'emma', userid: 'emma12345' }, { username: 'Bob', userid: 'bob12345' }, { username: 'Sam', userid: 'sam12345' } ]; const usersSet = new Set(data1.map((item) => item.userid_b)); data2.forEach((item) => usersSet.has(item.userid) && (item.newAttribute = true)); console.log(data2);

{{1}}

答案 2 :(得分:0)

你可以使用foreach循环遍历数组,见下文

var data1 = [ { userid_b: 'dan12345' }, { userid_b: 'emma12345' } ];
    var data2 =[ 
      { username: 'dan', userid: 'dan12345' },
      { username: 'johndoe', userid: 'john12345' },
      { username: 'emma', userid: 'emma12345' },
      { username: 'Bob', userid: 'bob12345' },
      { username: 'Sam', userid: 'sam12345' } 
    ];

    data1.forEach(function(data1record,index,data1arr){

          data2.forEach(function(data2record,data2idx,data2arr){

                if(data1record.userid_b===data2record.userid){

                    data2record["newAttribute"]=true;
                }

          })
    });

    console.log(data2);

答案 3 :(得分:0)

// Make an array of new users for easy lookup.
const newUsers = data1.map(elt => elt.userid_b);

// Filter data2 down to only matching elements, then add new attribute.
data2.filter(elt => newUsers.contains(elt.username))
  .forEach(elt => elt.newAttribute = true);

答案 4 :(得分:0)

你也可以这样做。

&#13;
&#13;
let data1 = [{
  userid_b: 'dan12345'
}, {
  userid_b: 'emma12345'
}]
let data2 = [{
  username: 'dan',
  userid: 'dan12345'
}, {
  username: 'johndoe',
  userid: 'john12345'
}, {
  username: 'emma',
  userid: 'emma12345'
}, {
  username: 'Bob',
  userid: 'bob12345'
}, {
  username: 'Sam',
  userid: 'sam12345'
}];


var userIds = data1.map(function(obj) {
  return obj.userid_b;
});


var result = data2.map(function(dataObj) {

  if (userIds.includes(dataObj.userid)) {
    dataObj.newAttribute = true;
  }
  return dataObj;
});

console.log(result);
&#13;
&#13;
&#13;

答案 5 :(得分:0)

使用map()indexOf()

从第一个数组的对象中获取用户名(值):

var data1_values = data1.map(o => {
    return o.userid_b;
});

结果为data1_values = ['dan12345', 'emma12345']

现在,使用data2浏览map()的对象。检查

data1_values.indexOf(o.userid) > -1 

odata2

的对象

如果data1_values中有o.userid

总计:

&#13;
&#13;
let data1 = [
  { userid_b: 'dan12345' },
  { userid_b: 'emma12345' }
];
let data2 = [
  { username: 'dan', userid: 'dan12345' },
  { username: 'johndoe', userid: 'john12345' },
  { username: 'emma', userid: 'emma12345' },
  { username: 'Bob', userid: 'bob12345' },
  { username: 'Sam', userid: 'sam12345' }
];

var data1_values = data1.map(o => {
  return o.userid_b;
});

data2.map((o, i) => {
  if(data1_values.indexOf(o.userid) > -1) {
    data2[i]["newAttribute"] = true;
  }
});

console.log(data2);
&#13;
&#13;
&#13;