如何使用指定的 text/characters NOT 键值获取 json 值
How do I fetch json values with specified text/characters NOT key value
我有一个奇怪的要求,要按值从 JSON 对象中获取值,例如在下面的 json 对象中,如果我将值作为 Steve 而不是像 Steve Jon 这样的完整值,我如何循环我的整个 json 对象并在整个 [=22= 中找到匹配的对象] 目的。
我的 json 对象非常大,请建议我在不影响性能的情况下循环整个对象的任何好方法。我检查了 JSON 路径表达式,但它不起作用
提前致谢
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);
});
我认为 blow 函数(来自 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。
根据您的对象,您可以这样做:
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" />
我在这里为你做了一个例子(更新不区分大小写的搜索):
我有一个奇怪的要求,要按值从 JSON 对象中获取值,例如在下面的 json 对象中,如果我将值作为 Steve 而不是像 Steve Jon 这样的完整值,我如何循环我的整个 json 对象并在整个 [=22= 中找到匹配的对象] 目的。 我的 json 对象非常大,请建议我在不影响性能的情况下循环整个对象的任何好方法。我检查了 JSON 路径表达式,但它不起作用
提前致谢
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);
});
我认为 blow 函数(来自 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。
根据您的对象,您可以这样做:
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" />
我在这里为你做了一个例子(更新不区分大小写的搜索):