【问题标题】:Update an array of objects using another array使用另一个数组更新对象数组
【发布时间】:2021-12-09 22:45:10
【问题描述】:

我需要根据 ES6 中的另一个数组来更新对象数组。 示例

let a = [ 
  { id : 23, active :false, status:"" },
  { id : 33, active :false, status:"" },
  { id : 167, active :false, status:"" },
  { id : 18, active :false, status:"" },
  { id : 200, active :false, status:"" },
]

我的第二个包含对象的数组

let marked = [167,33,23];

预期结果如下

let a = [ 
  { id : 23, active :true, status:"updated"},
  { id : 33, active :true, status:"updated" },
  { id : 167, active :true, status:"updated" },
  { id : 18, active :false, status:"" },
  { id : 200, active :false, status:"" },
]

请告诉我如何获得预期的结果。我们在 lodash 中还有其他方法吗?

【问题讨论】:

  • 我假设你也想要 {id:33, active:true}?
  • 是的 @BurakhanAksoy 用于 33、23 和 167
  • 你能解释一下吗
  • 18 有错别字对吧?
  • 是的@GiorgiMoniava 18 不是真的

标签: javascript arrays object ecmascript-6 lodash


【解决方案1】:

你不需要lodash,你可以这样做:

let a = [{
        id: 23,
        active: false
    },
    {
        id: 33,
        active: false
    },
    {
        id: 167,
        active: false
    },
    {
        id: 18,
        active: false
    },
    {
        id: 2,
        active: false
    },
]

let marked = [167, 33, 23];

let result = a.map(x => ({
    ...x,
    active: marked.includes(x.id)
}))
console.log(result)

如果您遍历 marked 数组并将其元素存储在一个对象中,您可以加快速度。然后在map 期间检查元素x.id 是否在对象内部会更快(与检查数组内部相比)。但实际上,在大多数情况下,您应该不会注意到差异。

【讨论】:

    【解决方案2】:

    试试这个,使用包含函数的地图函数。希望这个答案能给出你的实际结果。如果没有,请给我评论,我会给你另一个答案。

    const found = a.map(function(mapData){
        (marked.includes(mapData.id)) ? mapData.active = true : '';
        return mapData;
    })
    

    【讨论】:

    • 这不是一个好的解决方案,因为您在内部修改 mapData 对象。另外,为什么是三元表达式? if 就可以了。
    【解决方案3】:

    由于问题已更新,这实际上只是@Giorgi Moniava 答案的扩展。我认为您应该将他的答案标记为已接受的答案。基本上你需要做的就是检查active 的值是真还是假。如果为真,则将状态设置为updated,否则,将状态设置为空字符串。

    let a = [ 
      { id : 23, active :false, status:"" },
      { id : 33, active :false, status:"" },
      { id : 167, active :false, status:"" },
      { id : 18, active :false, status:"" },
      { id : 200, active :false, status:"" },
    ]
    
    let marked = [167,33,23];
    
    let result = a.map(obj => {
        const isActive = marked.includes(obj.id);
        const status = isActive ? 'updated' : '';
        return {
          ...obj,
          active: isActive,
          status: status
        }
    })
    console.log(result)
    

    【讨论】:

      猜你喜欢
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多