比较2个数组并分配匹配值

时间:2018-05-11 23:06:46

标签: javascript arrays ecmascript-6

我有2个对象阵列
第一个名为数据:

const data = [
  {
    id: 1,
    nombre: 'Piero',
  },
  {
    id: 4,
    nombre: 'Nelson',
  },
  {
    id: 7,
    nombre: 'Diego'
  },
 ]

,第二个名为 subs:

const subs = [
  {
    id: 1,
    name: 'Temprano',
  },
  {
    id: 4,
    name: 'A tiempo',
  },
  {
    id: 7,
    name: 'Tarde'
  },
]

我要比较它,如果它们具有相同的ID, subs 数组会将其名称值传递给它,如果它不匹配,它会在数据中加上' - '数组,试试这个:

data.forEach((d)=>{
 subs.forEach((s)=>{
   if(d.id === s.id){
     d.subname = s.name;
   }
   else {
     d.subname = '-';
    }
   });
 }); 

但始终使用'-'分配值,就好像它与任何值都不匹配一样。我做错了什么?还有其他更简单的方法吗?我非常感谢你的帮助。

subs 数组的大小可能会有所不同。

2 个答案:

答案 0 :(得分:1)

https://codepen.io/anon/pen/MGGBLP?editors=0010

const data = [
  {
    id: 1,
    nombre: 'Piero',
  },
  {
    id: 4,
    nombre: 'Nelson',
  },
  {
    id: 7,
    nombre: 'Diego'
  },
 ];

const subs = [
  {
    id: 1,
    name: 'Temprano',
  },
  {
    id: 4,
    name: 'A tiempo',
  },
  {
    id: 7,
    name: 'Tarde'
  },
];

// by caching one of the arrays in an object, it reduces the run time to linear.
const obj = subs.reduce((acc, item) => {
  acc[item.id] = item;
  return acc;
})

data.forEach(d => {
  if (d.id in obj) {
    d.subname = obj[d.id].name;
  } else {
    d.subname = '-';
  }
});

console.log(data);

答案 1 :(得分:1)

你只需要两行:

var findIds = id => subs.find(findId => findId.id === id);
data.forEach(findId => Object.assign(findId, findIds(findId.id)));

您的data数组对象现在应该包含subs数组中相应ID共享对象的name属性。

jsFiddle: https://jsfiddle.net/AndrewL64/9k1d3oj2/1/