在一个“.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.
如何每次通过 .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.