我有一个奇怪的要求是通过值从JSON对象获取值,例如在下面的json对象中,如果我将值传递为 Steve 而不是像 Steve Jon ,如何循环整个json对象并在整个json对象中找到匹配的对象。 我的json对象非常大,请建议我循环整个对象而不会破坏性能的任何好方法。我已经检查了JSONPath表达式,但它没有工作
提前致谢
grouped_people: {
'friends': [
{name: 'Steve Jon', country: 'NZ'},
{name: 'Jane Ken', country: 'US'},
{name: 'Mike Jhon', country: 'AU'},
{name: 'Mary Mani', country: 'NZ'},
],
'enemies': [
{name: 'Evil Steve', country: 'AU'},
{name: 'Betty', country: 'NZ'},
]
}
答案 0 :(得分:0)
您可以使用recursive
功能查找包含给定值的object
,如下所示。
var grouped_people = {
'friends': [{
name: 'Steve Jon',
country: 'NZ'
},
{
name: 'Jane Ken',
country: 'US'
},
{
name: 'Mike Jhon',
country: 'AU'
},
{
name: 'Mary Mani',
country: 'NZ'
},
],
'enemies': [{
name: 'Evil steve',
country: 'AU'
},
{
name: 'Betty',
country: 'NZ'
},
]
};
//Recursive function to search text in the object
function findObject(obj, text, callback) {
for (var k in obj) {
if (typeof obj[k] == "object" && obj[k] !== null) {
findObject(obj[k], text, callback);
} else {
if (obj[k].toLowerCase().indexOf(text.toLowerCase()) !== -1) {
callback(obj);
}
}
}
}
findObject(grouped_people, "Steve", function(obj) {
//All matched objects will return here.
console.log(obj);
});

答案 1 :(得分:0)
我认为打击功能(来自Google的Angular项目)可能对您有帮助:
/* Seach in Object */
var comparator = function(obj, text) {
if (obj && text && typeof obj === 'object' && typeof text === 'object') {
for (var objKey in obj) {
if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
comparator(obj[objKey], text[objKey])) {
return true;
}
}
return false;
}
text = ('' + text).toLowerCase();
return ('' + obj).toLowerCase().indexOf(text) > -1;
};
var search = function(obj, text) {
if (typeof text == 'string' && text.charAt(0) === '!') {
return !search(obj, text.substr(1));
}
switch (typeof obj) {
case "boolean":
case "number":
case "string":
return comparator(obj, text);
case "object":
switch (typeof text) {
case "object":
return comparator(obj, text);
default:
for (var objKey in obj) {
if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
return true;
}
}
break;
}
return false;
case "array":
for (var i = 0; i < obj.length; i++) {
if (search(obj[i], text)) {
return true;
}
}
return false;
default:
return false;
}
};
请参阅this post。
答案 2 :(得分:0)
根据您的对象,您可以执行以下操作:
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
for (var subKey in obj[key]) {
if(obj[key][subKey].name.toLowerCase().search(keyword)!=-1){
alert('The keyword exist')
return true;
}
}
}
alert('not found');
return false;
}
我假设您通过表单传递关键字,例如您可以将其传递给下面的方法:
<input type="text" id="keyword" placeholder="Enter Keyword" />
<input type="button" onclick="find(keyword.value)" value="find" />
我在这里为你做了一个例子(不区分大小写的搜索更新):