首页 > 解决方案 > 在 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”匹配的对象而不进行嵌套循环。我尝试了几种方法,但都失败了。

标签: javascript

解决方案


您可以创建一个Map对象,将每个对象idtags. 如果 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) ?? []
}));

推荐阅读