【问题标题】:Compare 2 arrays and assign matching value [duplicate]比较2个数组并分配匹配值[重复]
【发布时间】:2018-05-11 23:06:46
【问题描述】:

我有 2 个对象数组
第一个叫做 data:

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 数组的大小可能会有所不同。

【问题讨论】:

    标签: javascript arrays ecmascript-6


    【解决方案1】:

    找到成功的匹配项后,您似乎没有退出内部循环。

    在您正在寻找 Piero 匹配项的第一个示例中,在您的第一次迭代中,1===1d.subname 正确设置为“Temprano”。但是,您随后会继续比较这些值 - 1 !== 4,因此 Temprano 被“-”覆盖,1 !== 7 再次被覆盖。

    另一种方法:

    data.forEach(d => {
    const match = subs.find(s => s.id === d.id);
    d.subname = match ? match.name : '-';});
    

    我还建议添加一个您不希望找到匹配项的案例,这样您就可以看到它在两种情况下都有效!

    【讨论】:

    • 完美运行,非常感谢您的帮助和解释:D
    【解决方案2】:

    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);
    

    【讨论】:

      【解决方案3】:

      你只需要两行代码:

      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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-25
        • 1970-01-01
        • 1970-01-01
        • 2017-05-19
        相关资源
        最近更新 更多