繁体   English   中英

如何在JSON对象内的对象数组中搜索字符串并返回包含该对象的对象?

[英]How to search through an array of objects inside a JSON object for a string and return the object that contains it?

问题

我在这个SO答案中找到的搜索JSOn对象的方法效果很好,但是,我需要它返回“包含匹配对象,值或对的对象”,而不是返回匹配对象本身。

编码

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 (i == key && obj[key] == val) {
            objects.push(obj);
        }
    }
    return objects;
}
getObjects(obj, key, val);

问题

我该如何扩展它以返回包含匹配的对象/值/对对象,而不仅仅是匹配本身? (jQuery或JS)

JSON样本

例如,我需要检查键Event (或Event[#text] )的值“ Delivered,Front Door / Porch”是否存在,如果存在,则需要在找到该Event对象中找到EventDate

{
    "TrackResponse": {
        "TrackInfo": {
            "@attributes": {
                "ID": "9470111699000308312927"
            },
                "GuaranteedDeliveryDate": {
                "#text": "September 9, 2015"
            },
                "TrackSummary": {
                "EventTime": {
                    "#text": "2:06 pm"
                },
                    "EventDate": {
                    "#text": "September 10, 2015"
                },
                    "Event": {
                    "#text": "Delivered, Front Door/Porch"
                },
                ...
            },
                "TrackDetail": [{
                "EventTime": {
                    "#text": "8:07 am"
                },
                ...
            }, ... {
                "EventTime": {},
                ...
            }]
        }
    }
}

终于通过以下功能使用了此功能:

function ContainsKeyValue(obj, key, value) {
    if (obj[key] === value) return true;
    for (all in obj) {
        if (obj[all] != null && obj[all][key] === value) {
            return true;
        }
        if (typeof obj[all] == "object" && obj[all] != null) {
            var found = ContainsKeyValue(obj[all], key, value);
            if (found == true) return true;
        }
    }
    return false;
}
for (var eventType in historyDates) {
    for (var i = 0; i < trackingDetails.length; i++) {
        var detail = trackingDetails[i];
        if (ContainsKeyValue(detail, "#text", eventType)) {
            historyDates[eventType] = detail.EventDate["#text"];
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM