如何获取具有指定文本/字符的JSON值NOT键值
我有一个奇怪的要求,通过值从JSON对象获取值,例如在下面的json对象中,有两个数组在那里,如果我传递值作为史蒂夫而不是像史蒂夫乔恩,而不是像全价值如何循环我的整个json对象,并找到整个json对象中的匹配对象。 我的json对象非常大,请给我建议任何好的方法来循环整个对象而不会导致性能下降。我已经检查JSONPath表达,但它不是事先如何获取具有指定文本/字符的JSON值NOT键值
工作感谢
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
功能找到它包含如下的给定值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);
});
看起来不错并且如预期的那样,但挑战会来对于大json对象 –
@MallikarjunHampannavar没有其他的解决方案,而不是通过整个对象,因为你需要该对象作为输出。 :( – Thusitha
是的,你是正确的兄弟..我检查这个我的大对象,让我们看看性能 –
我觉得冲击功能(从谷歌的角度项目)可能帮助您:
/* 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;
}
};
根据你的对象,你可以这样做:
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" />
我做了一个例子,你在这里(更新不区分大小写搜索):
好的,但是有感觉的 –
好吧,我们只需要使用toLowerCase()来覆盖所有的,我更新代码;) –
对于g ood旧时尚for/foreach循环 – madalinivascu
@madalinivascu但是会杀死性能..如果你的json数据很大,请给出任何例子 –
然后根据提供的名称创建一个更多的api来获取数据。创建一个get方法并将名称作为参数传递,并使用该方法搜索数据库并返回结果。 –