【问题标题】:Path to matching key value pair in a nested object嵌套对象中匹配键值对的路径
【发布时间】:2013-11-26 10:42:37
【问题描述】:

我试图在嵌套对象中实现搜索。

   // Returns an array of matching objects
    function getObjects(obj, key, val) {
        var objects = [];
        for (var i in obj) {
            if (!obj.hasOwnProperty(i)) continue;
            if (typeof obj[i] == 'object') {
                objects = objects.concat(getObjects(obj[i], key, val));
            } else if (!$.isNumeric(obj[key]) && i == key && obj[key].toLowerCase().match(val)) {
                objects.push(obj);
            }
        }
        return objects;
    }

此函数根据提供的键值对返回匹配对象。

我想要的是找到键值对的对象的路径。

样本数据

TestObj = {
    "Categories": [{
        "Product1": [{
            "id": "a01",
            "name": "Pine",
            "description": "Short description of pine."
        }, {
            "id": "a02",
            "name": "Pine",
            "description": "Short description of pine."
        }, {
            "id": "a03",
            "name": "Poplar",
            "description": "Short description of poplar."
        }],
        "id": "A",
        "title": "Cheap",
        "description": "Short description of category A."
    }, {
        "Product2": [{
            "id": "b01",
            "name": "Maple",
            "description": "Short description of maple."
        }, {
            "id": "b02",
            "name": "Oak",
            "description": "Short description of oak."
        }, {
            "id": "b03",
            "name": "Bamboo",
            "description": "Short description of bamboo."
        }]
    }]
};

我正在尝试编写一个函数

function objPath(obj, key, val, path) {
    var result = [];
    var passName = '';
    if (path) {
        passName = path;
    }
    var tempArray = [];
    for (var prop in obj) {
        var value = obj[prop];
        if (typeof value === 'object') {
            tempArray = objPath(value, key, val, passName);
            $.each(tempArray, function (k, value) {
                result.push(value);
            });
        } else if (prop == key && obj[key].toLowerCase().match(val)) {
            result.push(obj[key]);
        }
    }
    return result;
}

如果我把函数称为

objPath(TestObj, 'id', 'b03');

应该返回Categories > Product2 > 3rd Row

但我得到的只是钥匙。如何修复objPath函数以获得所需的结果

【问题讨论】:

  • 想让我知道为什么是负面的?
  • 我本来想问同样的问题(我讨厌不加解释地投反对票——如果有人有问题,乐于助人是我的座右铭)。无论如何,我已经给你 +1 了,因为我认为这是一个公平的问题。
  • 我认为这是因为您没有真正解释您的问题是什么,以及没有说明您收到什么输出。
  • 您自己尝试过什么吗?该函数究竟应该返回什么,一个字符串?如果它现在返回匹配的对象,它是否应该不再这样做(因为你不能同时返回两个东西)?
  • 我的直觉是,作为一个递归函数,你必须在某个地方遇到一些溢出并在返回之前放弃。

标签: javascript jquery


【解决方案1】:

我写了一个自定义函数

function objPath(obj, key, val, path) {
    var result = [];
    var passName = '';
    if (path) {
        passName = path;
    }
    var tempArray = [];
    for (var prop in obj) {
        var value = obj[prop];
        if (typeof value === 'object') {
            tempArray = objPath(value, key, val, passName);
            $.each(tempArray, function (k, value) {
                result.push(value);
            });
        } else if (!$.isNumeric(obj[key]) && prop == key && obj[key].toLowerCase().match(val)) {
            result.push(passName + '["' + obj[prop] + '"]');
        } else {
            if ($.isNumeric(obj[prop])) {
                //passName += ' > ' + obj[prop];
            } else {
                passName += '["' + obj[prop] + '"]';
            }
        }
    }
    return result;
}

哪个会返回

["Categories"]["Product2"]["b03"]

【讨论】:

    猜你喜欢
    • 2022-12-17
    • 2021-11-27
    • 2021-05-26
    • 2013-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2021-02-07
    相关资源
    最近更新 更多