使用lodash通过属性名称提取深层嵌套的子对象

krl*_*krl 12 javascript lodash

我有深层嵌套对象的数组.我想编写一个函数来从这些数组中提取任意子对象.在某些情况下,嵌套属性的值是值和对象,在其他情况下,它们是数组.

数组的示例如下:

[{parent: {level1: {level2: 'data'}}}]

[{parent: {level1: [{level2: {...}}, {level2: {...}}, {level2: {...}}]}}]

[{parent: {level1: [{level2: {level3: 'data'}}, {level2: {..}}, {level2: {..}}]}}]
Run Code Online (Sandbox Code Playgroud)

在这样的数组上调用提取函数应该会产生一个我们感兴趣的对象数组.

调用上面示例数组的函数及其结果的示例:

extractChildren(source, 'level2') = [{level2: 'data'}]

extractChildren(source, 'level2') = [{level2: {...}, level2: {...}, level2: {...}]

extractChildren(source, 'level3') = [{level3: 'data'}]
Run Code Online (Sandbox Code Playgroud)

是否有一种简洁的方法来实现这一点,lodash或者我应该使用常规JavaScript来迭代属性?

PS认为它等同于XPath select all nodes with the name "nodename"

Fes*_*sto 1

我希望,它有帮助:

'use strict';

let _ = require("lodash");
let source = [{parent: {level1: [{level2: {level3: 'data'}}, {level2: {}}, {level2: {}}]}}];

function extractChildren(source, specKey) {
    let results = [];
    let search = function(source, specKey) {
        _.forEach(source, function(item) {
            if (!!item[specKey]) {
                let obj = {};
                obj[specKey] = item[specKey];
                results.push(obj);
                return;
            }

            search(item, specKey);
        });
    };

    search(source, specKey);
    return results;
};

console.log(extractChildren(source, 'level3'));
// [ { level3: 'data' } ]
Run Code Online (Sandbox Code Playgroud)