在一个“.map”中为数组的每个元素获取多个对象

Get multiple objects for each element of an array in one ".map"

如何每次通过 .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;
});

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

你可以使用find方法来判断它是否存在于result中,你可以push或者忽略它

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

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)

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

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

即returns["dispatch", "police", "fire"]。这是 demo in an Observable notebook.