javascript - 在 JavaScript 中组合两个 id 键匹配的对象数组
问题描述
我有一个涉及组合不同数组的 JavaScript 问题。
我在下面有一组对象:
"people": [
{
"city": "SF",
"email": "bob0@b.com",
"firstName": "Bob",
"id": "1",
"lastName": "Smith"
},
{
"city": "Boston",
"email": "bill@b.com",
"firstName": "Bill",
"id": "2",
"lastName": "Anderson"
},
{
"city": "Toronto",
"email": "ann@a.com",
"firstName": "Ann",
"id": "3",
"lastName": "Kline",
}
]
我还有一个标签数组数组,每个数组都有一个 id 对象:
[["tag 1", "tag 2", {"id": "1"}], ["tag 8", "tag 2", {"id": "3"}]]
预期的输出将是:
"people": [
{
"city": "SF",
"email": "bob0@b.com",
"firstName": "Bob",
"id": "1",
"lastName": "Smith",
"tags": ["tag 1", "tag 2"]
},
{
"city": "Boston",
"email": "bill@b.com",
"firstName": "Bill",
"id": "2",
"lastName": "Anderson"
},
{
"city": "Toronto",
"email": "ann@a.com",
"firstName": "Ann",
"id": "3",
"lastName": "Kline",
"tags": ["tag 8", "tag 2"]
}
]
有没有办法将标签添加到上面“id”匹配的对象而不进行嵌套循环。我尝试了几种方法,但都失败了。
解决方案
您可以创建一个Map
对象,将每个对象id
与tags
. 如果 Map 将当前id
作为键,则遍历 people 数组并添加一个属性
const people=[{city:"SF",email:"bob0@b.com",firstName:"Bob",id:"1",lastName:"Smith"},{city:"Boston",email:"bill@b.com",firstName:"Bill",id:"2",lastName:"Anderson"},{city:"Toronto",email:"ann@a.com",firstName:"Ann",id:"3",lastName:"Kline",}],
tags = [["tag 1", "tag 2", {"id": "1"}], ["tag 8", "tag 2", {"id": "3"}]]
const map = new Map( tags.map(t => [t.pop().id, t]) )
for (const p of people)
if (map.has(p.id))
p.tags = map.get(p.id)
console.log(people)
您还可以创建一个不会改变数组的版本
const map = new Map;
for (const t of tags)
map.set( t[t.length - 1].id, t.slice(0, -1) )
const output = people.map(p => ({
...p,
tags: map.get(p.id) ?? []
}));
推荐阅读
- c# - 如何执行“if else”来检查数组是否为空 .cshtml 文件
- kdb - 在 q 中基于客户端句柄请求运行 .z.pg 和 .z.ps
- javascript - 如果我们不确定属性在本机数组中的位置,如何获取属性的值
- javascript - 如何在没有代理的情况下为 Observable 对象中未定义的键设置默认值?
- angular - 角度 7 中的触摸事件没有任何反应
- ibm-doors - DOORS Layout DXL 将每个链接报告两次
- css - Slick Carousel 中的等高引导卡
- linux - 在 linux 终端上使用 gitstats
- grafana - 使用多个测量值在 Grafana 中使用 InfluxDB 创建视图
- typescript - 如何在 Async/await 中转换函数?