如何测试我的 json 的任何属性是否具有特定的子属性,没有循环
How do I test if any of my json's properties has a particular subproperty, without a loop?
考虑一个例子:
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');
相关文章:
- Javascript:循环属性内部的条件递增或递减
- 在循环中包含特定属性
- 借助for循环和数组在对象中添加属性
- 不可枚举的属性出现在 for..在 Chrome 中循环
- 我们可以设置属性'id'到不同的'按钮'通过使用javascript或jquery的循环
- 如何在循环中设置onclick属性
- 按数据属性循环元素并替换值
- 使用循环增加css属性值
- 循环浏览JavaScript对象并记录其属性
- ..的Javascript..循环中的对象没有在最后一个属性上运行
- 循环访问 JS 数组 + 数组属性
- 如何使用 jQuery 在循环中获取属性的值
- 为for循环中的对象添加新属性
- 在'用于'如果javascript中不存在对象属性,则循环
- Waypoint的循环,退出循环后属性未定义
- 如何循环对象中的javascript对象并查找属性
- 使用循环更新 JSON 属性值
- 未捕获的类型错误: 无法读取未定义的属性“循环”
- 使用点符号和括号显示..内部的属性..循环中
- 对象的正确属性循环