【问题标题】:Filtering for Nested Property in Javascript/Lodash在 Javascript/Lodash 中过滤嵌套属性
【发布时间】:2017-01-10 00:22:24
【问题描述】:

我目前有如下数据:

[{
    "id": 1,
    "name": "Canada",
    "checked": true,
    "vacationSpots": [{
        "id": 1,
        "name": "Toronto",
        "checked":false,
        "activities": [{
            "id": 1,
            "checked": false,
            "name": "Niagara Falls"
        }]
    }, {
        "id": 2,
        "name": "France",
        "checked":true,
        "activities": [{
            "id": 2,
            "checked":true,
            "name": "Eiffel tower"
        }]
    }]
}, {
    "id": 2,
    "name": "US",
    "checked": true,
    "vacationSpots": [{
        "id": 3,
        "name": "California",
        "checked": true,
        "activities": [{
            "id": 3,
            "name": "Surfing",
            "checked":false
        }]
    }]
}]

我正在从检查设置为 true 的活动中收集活动 ID。

所以结果看起来像这样:

2

虽然我可以得到这个,但我必须通过 3 个级别才能访问活动

  for (i = 0; i < country.length; i++){
    country = allAreas[i];
  ....
    for (j = 0; j < country.vacationSpots.length; j++){
  ....
        for (k = 0; k < vacationSpots.activities.length; k++){

(搜索国家,然后是vacationSpots,然后是活动。有没有办法在不遍历每个级别的情况下进行过滤?有没有办法用Lodash做到这一点?

【问题讨论】:

  • 在不使用嵌套迭代器的情况下没有办法做到这一点。您当前的代码是什么样的?
  • @Phil 我目前遍历的方式是通过三个 for 循环,1 个循环遍历每个国家,另一个循环遍历每个国家/地区的 VacationSpots,最后一个 1 循环遍历活动在每个度假胜地。
  • 我用我的一点 for loop sn-p 更新了我的代码
  • 如果你想通过一个数组来找东西,你必须通过数组。如果你想通过嵌套数组来查找东西,你必须通过嵌套数组——一种或另一种方式。
  • activities 可以包含多个元素吗?

标签: javascript filter nested lodash


【解决方案1】:

为了为整个数据集中的已检查活动提供一组唯一的活动 ID,假设任何特定活动可能出现在多个国家/地区/度假胜地,例如这应该足够了

let data = [{"id":1,"name":"Canada","checked":true,"vacationSpots":[{"id":1,"name":"Toronto","checked":false,"activities":[{"id":1,"checked":false,"name":"Niagara Falls"}]},{"id":2,"name":"France","checked":true,"activities":[{"id":2,"checked":true,"name":"Eiffel tower"}]}]},{"id":2,"name":"US","checked":true,"vacationSpots":[{"id":3,"name":"California","checked":true,"activities":[{"id":3,"name":"Surfing","checked":false}]}]}];

let activityMap = data.reduce((map, country) => {
    country.vacationSpots.forEach(vs => {
        vs.activities.forEach(activity => {
            if (activity.checked) {
                map[activity.id] = true;
            }
        });
    });
    return map;
}, Object.create(null));

let activities = Object.keys(activityMap).map(Number);
console.log(activities);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-27
    • 2019-04-14
    • 2017-09-01
    • 2021-09-27
    • 2017-06-15
    • 1970-01-01
    • 2023-03-31
    • 2016-03-23
    相关资源
    最近更新 更多