如何反转嵌套数组/对象结构并按最低对象重新加密?

问题描述 投票:0回答:2

我有 lodash 4.17 可用

我有以下API响应结构:

{
    "things": [
        {
            "id": 14500,
            "name": "Q1 Out Ind",
            "thing_type_id": 6,
            "owner_id": 1680,
            "owner": {
                "id": 1680,
                "model_id": 602
            },
            "thing_type": {
                "id": 6,
                "name": "The Type of Thing"
            },
            "related_things": [
                {
                    "id": 9749,
                    "name": "unnamed thing",
                    "thing_id": 14500,
                    "more_things": [
                        {
                            "id": 16166,
                            "name": "Num Thing Sum",
                            "datasource_object_id": 9408,
                            "thing_id": 9749,
                            "external_datasource": {
                                "id": 9408,
                                "parent_id": 2810,
                                "target_id": 15028
                            }
                        }
                    ]
                }
            ]
        },
        {
            "id": 14503,
            "name": "Q2 Out Ind",
            "thing_type_id": 6,
            "owner_id": 1681,
            "owner": {
                "id": 1681,
                "model_id": 602
            },
            "thing_type": {
                "id": 6,
                "name": "The Type of Thing"
            },
            "related_things": [
                {
                    "id": 9750,
                    "name": "unnamed thing2",
                    "thing_id": 14503,
                    "more_things": [
                        {
                            "id": 16167,
                            "name": "Num Thing Avg",
                            "datasource_object_id": 9409,
                            "thing_id": 9750,
                            "external_datasource": {
                                "id": 9409,
                                "parent_id": 2810,
                                "target_id": 15029
                            }
                        },
                        {
                            "id": 16168,
                            "name": "Num Thing Count",
                            "datasource_object_id": 9408,
                            "thing_id": 9750,
                            "external_datasource": {
                                "id": 9408,
                                "parent_id": 2810,
                                "target_id": 15028
                            }
                        }
                    ]
                }
            ]
        }
    ]
}

我正在尝试在嵌套的最后获得匹配特定

target_id
的对象列表。

到目前为止,以下仅在数组中有一个结果时有效:

_.filter(things.things, 
      function (obj) {
        return obj.related_things[0].more_things[0].external_datasource.target_id == 15028;
      }
  )

但是,正如您在这个例子中看到的,在这种情况下,它有两个“东西”,它们的末尾有一个匹配项,因为有

more_things
related_things
的数组 - 我如何调整我的 lodash 过滤器以搜索任何深度?我需要一个匹配对象列表,以在 UI 中显示与匹配目标相关的各种属性。

javascript lodash
2个回答
0
投票

您可以在

_some
中嵌套
filter
函数。顺便说一句,这对于原生数组
filter
some

也是可能的

const things = {    "things": [        {            "id": 14500,            "name": "Q1 Out Ind",            "thing_type_id": 6,            "owner_id": 1680,            "owner": {                "id": 1680,                "model_id": 602            },            "thing_type": {                "id": 6,                "name": "The Type of Thing"            },            "related_things": [                {                    "id": 9749,                    "name": "unnamed thing",                    "thing_id": 14500,                    "more_things": [                        {                            "id": 16166,                            "name": "Num Thing Sum",                            "datasource_object_id": 9408,                            "thing_id": 9749,                            "external_datasource": {                                "id": 9408,                                "parent_id": 2810,                                "target_id": 15028                            }                        }                    ]                }            ]        },        {            "id": 14503,            "name": "Q2 Out Ind",            "thing_type_id": 6,            "owner_id": 1681,            "owner": {                "id": 1681,                "model_id": 602            },            "thing_type": {                "id": 6,                "name": "The Type of Thing"            },            "related_things": [                {                    "id": 9750,                    "name": "unnamed thing2",                    "thing_id": 14503,                    "more_things": [                        {                            "id": 16167,                            "name": "Num Thing Avg",                            "datasource_object_id": 9409,                            "thing_id": 9750,                            "external_datasource": {                                "id": 9409,                                "parent_id": 2810,                                "target_id": 15029                            }                        },                        {                            "id": 16168,                            "name": "Num Thing Count",                            "datasource_object_id": 9408,                            "thing_id": 9750,                            "external_datasource": {                                "id": 9408,                                "form_id": 2810,                                "target_id": 15028                            }                        }                    ]                }            ]        }    ]}

const id = 15028

const res = _.filter(things.things, a => {
  return _.some(a.related_things, b => {
    return _.some(b.more_things, c => c.external_datasource.target_id === id)
  })
})

console.log(res)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

没有lodash

const things = {    "things": [        {            "id": 14500,            "name": "Q1 Out Ind",            "thing_type_id": 6,            "owner_id": 1680,            "owner": {                "id": 1680,                "model_id": 602            },            "thing_type": {                "id": 6,                "name": "The Type of Thing"            },            "related_things": [                {                    "id": 9749,                    "name": "unnamed thing",                    "thing_id": 14500,                    "more_things": [                        {                            "id": 16166,                            "name": "Num Thing Sum",                            "datasource_object_id": 9408,                            "thing_id": 9749,                            "external_datasource": {                                "id": 9408,                                "parent_id": 2810,                                "target_id": 15028                            }                        }                    ]                }            ]        },        {            "id": 14503,            "name": "Q2 Out Ind",            "thing_type_id": 6,            "owner_id": 1681,            "owner": {                "id": 1681,                "model_id": 602            },            "thing_type": {                "id": 6,                "name": "The Type of Thing"            },            "related_things": [                {                    "id": 9750,                    "name": "unnamed thing2",                    "thing_id": 14503,                    "more_things": [                        {                            "id": 16167,                            "name": "Num Thing Avg",                            "datasource_object_id": 9409,                            "thing_id": 9750,                            "external_datasource": {                                "id": 9409,                                "parent_id": 2810,                                "target_id": 15029                            }                        },                        {                            "id": 16168,                            "name": "Num Thing Count",                            "datasource_object_id": 9408,                            "thing_id": 9750,                            "external_datasource": {                                "id": 9408,                                "form_id": 2810,                                "target_id": 15028                            }                        }                    ]                }            ]        }    ]}

const id = 15028

const res = things.things.filter(a => {
  return a.related_things.some(b => {
    return b.more_things.some(c => c.external_datasource.target_id === id)
  })
})

console.log(res)


0
投票

您可以将

flatMap
some
filter

一起使用

const things= {
    "things": [   
        {
            "id": 14500,
            "name": "Q1 Out Ind",
            "thing_type_id": 6,
            "owner_id": 1680,
            "owner": {
                "id": 1680,
                "model_id": 602
            },
            "thing_type": {
                "id": 6,
                "name": "The Type of Thing"
            },
            "related_things": [
                {
                    "id": 9749,
                    "name": "unnamed thing",
                    "thing_id": 14500,
                    "more_things": [
                        {
                            "id": 16166,
                            "name": "Num Thing Sum",
                            "datasource_object_id": 9408,
                            "thing_id": 9749,
                            "external_datasource": {
                                "id": 9408,
                                "parent_id": 2810,
                                "target_id": 15028
                            }
                        }
                    ]
                }
            ]
        },
        {
            "id": 14503,
            "name": "Q2 Out Ind",
            "thing_type_id": 6,
            "owner_id": 1681,
            "owner": {
                "id": 1681,
                "model_id": 602
            },
            "thing_type": {
                "id": 6,
                "name": "The Type of Thing"
            },
            "related_things": [
                {
                    "id": 9750,
                    "name": "unnamed thing2",
                    "thing_id": 14503,
                    "more_things": [
                        {
                            "id": 16167,
                            "name": "Num Thing Avg",
                            "datasource_object_id": 9409,
                            "thing_id": 9750,
                            "external_datasource": {
                                "id": 9409,
                                "parent_id": 2810,
                                "target_id": 15029
                            }
                        },
                        {
                            "id": 16168,
                            "name": "Num Thing Count",
                            "datasource_object_id": 9408,
                            "thing_id": 9750,
                            "external_datasource": {
                                "id": 9408,
                                "parent_id": 2810,
                                "target_id": 15028
                            }
                        }
                    ]
                }
            ]
        }
    ]
}


const results = _.filter(things.things, thing => {
  const relatedThings = _.flatMap(thing.related_things, 'more_things');
  return _.some(relatedThings, moreThing => moreThing.external_datasource.target_id == 15028);
});
console.log(results)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

© www.soinside.com 2019 - 2024. All rights reserved.