javascript - 如何使用 JavaScript/Prototype 1.7 递归搜索对象树并根据键/值返回匹配对象

标签 javascript recursion tree prototype javascript-objects

我有一些嵌套的对象数据,我想搜索它并根据 id 返回匹配的对象。

var data = [{id: 0, name: 'Template 0', subComponents:[
        {id: 1, name: 'Template 1', subItems:[
            {id: 2, name: 'Template 2', subComponents:[{id: 3, name: 'Template 3'}], subItems: [{id: 4, name: 'Template 4'}]}
        ]}
    ]}
];

所以我想做这样的事情

getObjectByKeyValue({id: 3}) 

让它返回

{id: 3, name: 'Template 3'}

因为我有子项目和子组件,每个子组件都可以有子项,所以它必须一般地完成。

我使用 Prototype 1.7 尝试过这个,但没有成功——我认为这只是搜索一个数组,而不是一个带有子节点的树:

data.find(function(s){return s.id == 4;})

提前致谢!!!!!!

最佳答案

我走了一条略有不同的路线,将 findKey 方法设为对象原型(prototype):

Object.prototype.findKey = function(keyObj) {
    var p, key, val, tRet;
    for (p in keyObj) {
        if (keyObj.hasOwnProperty(p)) {
            key = p;
            val = keyObj[p];
        }
    }

    for (p in this) {
        if (p == key) {
            if (this[p] == val) {
                return this;
            }
        } else if (this[p] instanceof Object) {
            if (this.hasOwnProperty(p)) {
                tRet = this[p].findKey(keyObj);
                if (tRet) { return tRet; }
            }
        }
    }

    return false;
};

您可以直接在数据对象上调用,传递您要查找的键/值:

data.findKey({ id: 3 });

请注意,此函数允许您根据任意键查找对象:

data.findKey({ name: 'Template 0' });

See example → (打开控制台查看结果)

关于javascript - 如何使用 JavaScript/Prototype 1.7 递归搜索对象树并根据键/值返回匹配对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443436/

相关文章:

algorithm - 如何有效地从某些节点生成二叉树?

javascript - 将组件传递给 Angularjs 对话框模板时删除额外的 md-dialog 包装器

javascript - AngularJS FeedReader - 不填充数组

Python - 增加 mac osx 中的递归限制

java - 从以下树状数据结构中获取所有可能的组合

javascript - js - 如何将表数据转换为树 (JSON)

javascript - 如何从这个 d3.js layout.tree 中获取树祖先和树后代的列表?

javascript - 使用 Javascript 对象在 Canvas 上绘制一 block 板

javascript - View 不会更新,但 URL 在 React Router V6 中会更新

python - 如何在 Python 中创建多个 for 列表循环的递归以获得组合?