Javascript/Lodash中嵌套属性的过滤

Filtering for Nested Property in Javascript/Lodash

本文关键字:属性 过滤 嵌套 Lodash Javascript      更新时间:2023-09-26

我目前的数据看起来像这样:

[{
    "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++){

(搜索国家,然后是度假地点,然后是活动。有没有办法在不遍历每个关卡的情况下过滤这些内容?对洛达什有什么办法吗?

为了在整个数据集中为检查过的活动提供唯一的活动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);