【问题标题】:Get multiple objects for each element of an array in one ".map"在一个“.map”中为数组的每个元素获取多个对象
【发布时间】:2021-10-31 15:35:55
【问题描述】:

如何通过 .map 为同一个数组创建两个相同的对象?

有如下数据集:

data = [
  {initiatorRole: "dispatch", receiverRole: "police"},
  {initiatorRole: "dispatch", receiverRole: "fire"},
  {initiatorRole: "police", receiverRole: "dispatch"}
]

我想将它们放入一组对象中,我将在其中删除重复项并添加其他数据。

roles = [
  {role: "dispatch"},
  {role: "police"},
  {role: "dispatch",
  {role: "fire"},
  {role: "police"},
  {role: "dispatch"}
]

我目前拥有的代码:

roles = data.map(d => {
  let rObj = {}
  rObj["id"] = d.initiatorRole
  rObj["id"] = d.receiverRole
  return rObj;
});

当然,这只是返回最后一个 rObj 集。这可以通过一次地图调用来完成吗?

【问题讨论】:

  • 所以...也许吧,因为作为一名初级编码员,我不这么认为。那么你的回答可能是下面的答案......“我不会使用.map,我会以这种方式使用.reduce......就像那个回答它的人一样。
  • 看起来这里有很多类似问题的答案:stackoverflow.com/questions/46986710/…顺便说一句,我调整了你的标题,主要是为了删除“Observable”,因为它可能会混淆未来的搜索者(我认为这是一个好问题对于任何类型的 JavaScript),并在您的代码示例中修复了几个引号。很高兴我的回答有帮助,干杯!
  • @Toph 虽然我最初并没有考虑 dups,但有趣的是,我想知道如何返回多个对象。这就是问题所在。您的笔记本提供了令人难以置信的学习体验,让您可以耐心地了解已提出和未提出的问题。

标签: javascript array.prototype.map observablehq


【解决方案1】:

您可以将数组映射到两个角色的数组,并在同一步骤中使用 flatMap 将其展平,然后通过将其变为 Set 并返回数组来删除重复项:

roles = [...new Set(data.flatMap((d) => [d.initiatorRole, d.receiverRole]))]

返回["dispatch", "police", "fire"]。这是demo in an Observable notebook。

【讨论】:

  • 不错。优雅的解决方案。
  • 哇。非常感谢 Observable 的解释。它显然有效并且比其他解决方案短得多,但是 DANG,这是我不知道我是否会达到的那种抽象。
  • 回到那个 Observable 页面并用它再次做一些事情。很有帮助。
【解决方案2】:

你可以使用 find 方法来判断它是否存在于结果中,你可以推送或忽略它

const myData = [
  {initiatorRole: "dispatch", receiverRole: "police"},
  {initiatorRole: "dispatch",  receiverRole: "fire"},
  {initiatorRole: "police", receiverRole: "dispatch"}
  ]

function flatAndRemoveDuplicate(data) {
  const result = [];
  
  for(let role of data) {
    const canfindInitiatorInResult = result.find(item => item.role == role.initiatorRole)
    const canfindReceiverResult = result.find(item => item.role == role.receiverRole)
     
    if(!canfindInitiatorInResult){
      result.push({role: role.initiatorRole})  
    }
    if(!canfindReceiverResult) {
            result.push({role: role.receiverRole})  
    }
  }
  return result;
}

console.log(flatAndRemoveDuplicate(myData))
   

【讨论】:

    【解决方案3】:
    data = [
      { initiatorRole: "dispatch", receiverRole: "police" },
      { initiatorRole: "dispatch", receiverRole: "fire" },
      { initiatorRole: "police", receiverRole: "dispatch" },
    ]
    
    let rObj = []
    data.forEach((d) => {
      rObj.push({ role: d.initiatorRole })
      rObj.push({ role: d.receiverRole })
    })
    
    const duplicateRemover = new Set()
    
    const distinctArrObj = rObj.filter((obj) => {
      if (duplicateRemover.has(JSON.stringify(obj))) return false
      duplicateRemover.add(JSON.stringify(obj))
      return true
    })
    
    console.log(distinctArrObj)
    

    【讨论】:

      猜你喜欢
      • 2019-09-20
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 2018-11-23
      相关资源
      最近更新 更多