【问题标题】:Finding all child properties with a certain "key object" in a tree-like js object在树状 js 对象中查找具有某个“关键对象”的所有子属性
【发布时间】:2017-05-15 11:22:11
【问题描述】:

我正在尝试扩展下面的 findKey 算法(在 nodejs 中)以支持在树中查找与 keyObj 签名匹配的所有子对象实例。原算法:

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;
}

我第一次天真的尝试完成查找所有:

Object.prototype.findAllWithKey = function(keyObject) {
    let objectCopy = Object.assign({}, this);
    console.log('findAll on : \n\n');
    console.log(this);
    let keyFound = false;
    let keysFound = [];
    do {
        console.log("while loop iteration...");
        keyFound = objectCopy.findKey(keyObject);
        console.log(keyFound);
        if (keyFound) {
            keysFound.push(keyFound);
            console.log('\n\nkey found:');
            objectCopy = JSON.parse(JSON.stringify(objectCopy).replace(JSON.stringify(keyFound)+',', ''));
        } else {
            console.log('\n\n key not found');
            keyFound = false;
        }

    } while (keyFound !== false);
    console.log('Broke out of while loop')
};

用法如下:

        let targetObject = response.findAllWithKey({
            name: 'GetStatusCode'
        });

其中响应​​对象包含一个 js 树结构,其中包含多个子对象和具有 {name: 'GetStatusCode'} 的子对象实例。

有人可以为我指出正确的方向以找到更好的方法来实现这一点,因为 JSON 字符串化/解析感觉不合时宜,(加上它在最后一个对象上失败,因为没有,在那里提供,这个我可以修复,但是有必须是完成 findAll 的更好方法。

【问题讨论】:

  • 你能分享一些示例输入和相应的输出吗?

标签: javascript json node.js search


【解决方案1】:

事实证明,我可以使用树遍历完成所有查找,因为 xml、json 或其他任何内容实际上都是由树结构组成的。例如,可以使用preorder 遍历算法(lodash 在其 contrib 包中提供了一些关于树遍历的帮助)。

Object.prototype.findAllWithKey = function(keyObject) {
    resultSet = [], i = 0;
    _.walk.preorder(this, function(value, key, parent) {
        if (keyObject[key] === value) {
            resultSet.push(parent);
        }
    });
    return resultSet;
};

【讨论】:

  • 注意,用未标记的库回答问题可能会产生误导,并且可能会引起反对
  • 您可以使用任何您喜欢的方式来完成预排序/遍历,我更新了我的答案以更多地关注有问题的算法@Rajesh
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 2011-03-10
相关资源
最近更新 更多