【问题标题】:Add key value to an object array if it has same key value如果对象数组具有相同的键值,则将键值添加到对象数组
【发布时间】:2022-06-10 17:23:41
【问题描述】:

我正在尝试根据另一个数组中的对应值,将具有特定值的属性添加到一个数组中的所有对象。

const array1 = [
  {
    id: 1,
    date: '2022.05.01',
    name: 'john'
  }, {
    id: 2,
    date: '2022.05.01',
    name: 'sam'
  }, {
    id: 3,
    date: '2022.05.03',
    name: 'john'
  }, {
    id: 4,
    date: '2022.05.06',
    name: 'jack'
  },
 ]
    

此数组包含需要进行的必要修改:

const array2 = [
  {
    name: 'john',
    isCanceled: true,
  }, {
    name: 'jack',
    isCanceled: false,
  }, {
    name: 'sam',
    isCanceled: false,
  },
 ]

如果array1 中的对象名称为john,则isCanceled 应设置为true,但如果为jack 或sam,则应设置为false,如下所示:

const resultArray = [
  {
    id: 1,
    date: '2022.05.01',
    name: 'john',
    isCanceled: true,
  }, {
    id: 2,
    date: '2022.05.01',
    name: 'sam'
    isCanceled: false,
  }, {
    id: 3,
    date: '2022.05.03',
    name: 'john'
    isCanceled: true,
  }, {
    id: 4,
    date: '2022.05.06',
    name: 'jack'
    isCanceled: false,
  },
 ];

【问题讨论】:

  • 你尝试过什么,它到底有什么问题?
  • 你有 3 个可以运行的 sn-ps,但是,没有要运行的代码,只有变量声明......你忘记代码了吗?

标签: javascript arrays object


【解决方案1】:

您可以更简单地做到这一点,首先将您的 array2 转换为一个对象,然后在 map 中使用查找,如下所示:

const array1 = [{id:1,date:"2022.05.01",name:"john"},{id:2,date:"2022.05.01",name:"sam"},{id:3,date:"2022.05.03",name:"john"},{id:4,date:"2022.05.06",name:"jack"},];

const array2 = [{name:"john",isCanceled:true},{name:"jack",isCanceled:false},{name:"sam",isCanceled:false}];

const arrCancel = array2.reduce((a, { name, isCanceled }) => {
  a[name] = isCanceled;
  return a;
}, {});

const resultArr = array1.map(e => {
  e.isCanceled = arrCancel[e.name];
  return e;
});

console.log(resultArr);
.as-console-wrapper { max-height: 100% !important; top: auto; }

【讨论】:

    【解决方案2】:

    构建一个包含状态的status 查找对象,并映射您的数组以包含查找对象中的匹配值:

    const status = Object.fromEntries(
      array2.map(({name, isCanceled}) => [name, isCanceled])
    );
    
    const resultArray = array1.map(({id, date, name}) => ({
      id,
      date,
      name,
      isCanceled: status[name]
    }));
    

    或者,如果你只是想修改array1而不是创建一个新数组,第二步可以替换为:

    array1.forEach(v => v.isCanceled = status[v.name]);
    

    完成sn-p:

    const array1 = [{
      id: 1,
      date: '2022.05.01',
      name: 'john'
    }, {
      id: 2,
      date: '2022.05.01',
      name: 'sam'
    }, {
      id: 3,
      date: '2022.05.03',
      name: 'john'
    }, {
      id: 4,
      date: '2022.05.06',
      name: 'jack'
    }, ];
    
    const array2 = [{
      name: 'john',
      isCanceled: true,
    }, {
      name: 'jack',
      isCanceled: false,
    }, {
      name: 'sam',
      isCanceled: false,
    }, ];
    
    const status = Object.fromEntries(
      array2.map(({name, isCanceled}) => [name, isCanceled])
    );
    
    const resultArray = array1.map(({id, date, name}) => ({
      id,
      date,
      name,
      isCanceled: status[name]
    }));
    
    console.log(resultArray);

    您是否想知道为什么我更喜欢构建查找对象而不是在map() 操作中使用find():就复杂度而言,查找表的复杂度为O(1) ,而find() 方法是O(n)。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      const result = array1.map(person => {
        const lookPerson = array2.find(person2 => person2.name === person.name);
        return (lookPerson) ? { 
          ...person,
          isCanceled: lookPerson.isCanceled
        } : person;
      });
      
      • 结合array.map来变换array1

      • 使用 array.find 获取 array1 和 array2 之间相似人的第一次迭代

      • 合并对象

        { 
          ...person,
          isCanceled: lookPerson.isCanceled
        }
        

      const array1 = [{
        id: 1,
        date: '2022.05.01',
        name: 'john'
      }, {
        id: 2,
        date: '2022.05.01',
        name: 'sam'
      }, {
        id: 3,
        date: '2022.05.03',
        name: 'john'
      }, {
        id: 4,
        date: '2022.05.06',
        name: 'jack'
      }, ];
      
      const array2 = [{
        name: 'john',
        isCanceled: true,
      }, {
        name: 'jack',
        isCanceled: false,
      }, {
        name: 'sam',
        isCanceled: false,
      }, ];
      
      
      const result = array1.map(person => {
        const lookPerson = array2.find(person2 => person2.name === person.name);
        return (lookPerson) ? { 
          ...person,
          isCanceled: lookPerson.isCanceled
        } : person;
      });
      console.log(result);

      【讨论】:

        猜你喜欢
        • 2020-06-12
        • 1970-01-01
        • 2017-07-04
        • 2019-07-03
        • 2020-07-06
        • 1970-01-01
        • 2016-07-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多