如何测试我的 json 的任何属性是否具有特定的子属性,没有循环

How do I test if any of my json's properties has a particular subproperty, without a loop?

本文关键字:属性 循环 是否 任何 何测试 测试 json 我的      更新时间:2023-09-26

考虑一个例子:

food : {
    cheese: { taste: "delicious", smell: "smelly" },
    bacon:  { taste: "godly", smell: "godly" }
}

我想要一个无环测试,看看是否有任何"食物"的属性(奶酪和/或培根)具有"敬虔"的"味道"。

在这种情况下,这将是肯定的。测试"恶心"应该导致错误,因为没有味道:"恶心"

我的问题实际上围绕着一个无循环的解决方案,因为几层循环中的一百个属性 json 是不好的:(

我想要一个无环测试,看看是否有任何"食物"的属性(奶酪和/或培根)具有"敬虔"的"味道"。

你不能。假设您已将 JSON 反序列化为对象图,则必须有一个循环,因为您必须单独测试对象。

如果您尚未将 JSON 反序列化为对象图(或者如果您想将该图反馈回 JSON.stringify ,尽管我不建议这样做 ——因为这会涉及循环),如果您仍然有文本,那么可以使用正则表达式,例如:

if (jsontext.match(/'b"taste"'s*:'s*"godly"/) {
    // ...something has a taste that is "godly"
}

请注意,在上面,我假设了有效的 JSON。您的问题没有有效的 JSON,因为taste不在双引号中,而双引号在 JSON 中是必需的。

我的问题实际上围绕着一个无循环的解决方案,因为几层循环中的一百个属性 json 是不好的:(

好吧,那么你需要让负责JSON的人重新设计它。

您可以通过循环访问一次来预先索引所有数据:

var tastes = {}, smells = {};
for (var prop in food) {
    if (food.hasOwnProperty(prop) {
        var item = food[prop];
        if (!tastes[item.taste]) { tastes[item.taste] = [] };
        tastes[item.taste].push(prop);
        if (!smells[item.smell]) { smells[item.smell] = [] };
        tastes[item.smell].push(prop);
    }
}

然后,将来,您可以:

if (tests.godly) { ... }

。这将使您不必在每次要查询数据时遍历数据,但您无法完全消除循环。

在这种情况下

,循环是必需的。

function checkTaste(obj, keyToCheck, valToCheck) {
    for (var key in obj) {
        if (key === keyToCheck && obj[key] === valToCheck) {
            return true;
        }
    }
    return false;
}
checkKey(food, 'taste', 'godly');