javascript - 查找对象和数组中的嵌套值之间的匹配

标签 javascript arrays

我有两个数组:

首先,我有一个包含人员信息的对象数组,以及一个包含他们从类别列表中做出的选择的数组。

在第二个中,我有一个对象数组,其中包含第一个数组中的人可以从中进行选择的类别。每个类别对象内部都有一个类别标题和一个选择数组,我希望其中包含选择此类别的玩家列表。

我需要根据每个类别选择类别的人数来渲染用户界面中的元素。我想知道我是否可以迭代第一个数组中具有类别标题的人员选择,在第二个数组中找到匹配的类别标题,并将该人员信息从第一个数组推送到第二个。

我绝对愿意重组这些数组,但第二个数组包含更多信息,与此问题无关,并且更愿意保持原样。我必须对第一个数组进行硬编码,因为我只是从发送给我的电子邮件中获取该信息,目前我无法在选择一个人时将其选择插入第二个数组。

下面是我想要实现的目标的示例。

listOfPeople: [
        {
            personName: 'Eric Smith',
            selections: [
                {
                    categoryTitle: 'Fruit',
                    categoryItem: 'Apple',
                },
                {
                    categoryTitle: 'Animals',
                    categoryItem: 'Dog',
                },
                {
                    categoryTitle: 'Cars',
                    categoryItem: 'Ford'
                },
            ]
        },
        {
            personName: 'Sarah Edwards',
            selections: [
                {
                    categoryTitle: 'Shoes',
                    categoryItem: 'Running Shoe',
                },
                {
                    categoryTitle: 'Animals',
                    categoryItem: 'Cat',
                },
            ]
        }
    ],
    listOfCategories: [
        {
            categoryTitle: 'Fruit',
            peopleWhoSelected: [
                {
                    personName: 'Eric Smith',
                    categoryItem: 'Apple',
                },
            ]
        },
        {
            categoryTitle: 'Animals',
            peopleWhoSelected: [
                {
                    personName: 'Eric Smith',
                    categoryItem: 'Dog',
                },
                {
                    personName: 'Sarah Edwards',
                    categoryItem: 'Cat',
                },
            ]
        },
        {
            categoryTitle: 'Cars',
            peopleWhoSelected: [
                {
                    personName: 'Eric Smith',
                    categoryItem: 'Ford',
                },
            ]
        },
    ]

最佳答案

如果您可以简化第一个对象,我建议您这样做:

const people =
{
  "Eric Smith": {
    "Fruit": "Apple",
    "Animals": "Dog",
    "Cars": "Ford"
  },
  "Sarah Edwards": {
    "Shoes": "Running Shoe",
    "Animals": "Cat"
  }
}

您可以直接获得人们选择的内容。

然后将一个人的选择插入第二个数组:

Object.entries(people).forEach(([person, categories]) => 
  Object.entries(categories).forEach(([title, item]) => {
    let category = listOfCategories.find(c => c.categoryTitle == title)
    // Create category if we didn't find it
    if (!category) {
      category = {
        categoryTitle: title,
        peopleWhoSelected: []
      }
      listOfCategories.push(category)
    }
    // Add item selected and person name to category
    category.peopleWhoSelected.push({
      personName: person,
      categoryItem: item
    })    
  }))

这里有一个工作示例(打开控制台查看结果):https://jsfiddle.net/1pxhvo5k/

希望这有帮助:)

关于javascript - 查找对象和数组中的嵌套值之间的匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54813238/

相关文章:

javascript - 使用Facebook的DataLoader传递参数

javascript - 在 emberjs 中移动重复的路由代码

ios - 从 Firebase 填充的 CLLocationCooperative2D 数组不保留其条目。 swift 4

c# - 结构类型数组的性能

javascript - 将对象插入数组

javascript - JSON 分页响应 javascript

javascript - 在 Node 脚本中,如何监视文件的更改并获取更新的内容?

javascript - 写出 base 7 word 的函数,如二进制计数器样式

php - 处理 PHP 多维数组以将键指定为值数组的父级

Java 对象未返回预期数据