我有很多类似的对象,像这样;
[
{
"foo" : "bar",
"bar" : "sit"
},
{
"foo" : "lorem",
"bar" : "ipsum"
},
{
"foo" : "dolor",
"bar" : "amet"
}
]
我想用关键字搜索这些对象的值(而不是键),并返回在任何值中都包含关键字的对象数组。
因此,例如,使用关键字
r
,我将获得所有对象(对象#1中的“baR”,对象#2中的“loRem”和对象#3中的“doloR”)。使用关键字lo
,我将得到对象2和3(“LOrem”和“doLOr”),使用a
,我将得到对象1和3(“bAr”和“Amet”)。但是,使用关键字foo
,我会得到一个空数组,因为“foo”是键,并且在任何值中都找不到(与“bar”不同)……您就明白了。我将如何去做呢?在此先多谢!
最佳答案
像这样:
var objects = [
{
"foo" : "bar",
"bar" : "sit"
},
{
"foo" : "lorem",
"bar" : "ipsum"
},
{
"foo" : "dolor",
"bar" : "amet"
}
];
var results = [];
var toSearch = "lo";
for(var i=0; i<objects.length; i++) {
for(key in objects[i]) {
if(objects[i][key].indexOf(toSearch)!=-1) {
results.push(objects[i]);
}
}
}
结果数组将包含所有匹配的对象。
如果搜索“lo”,结果将类似于:
[{ foo="lorem", bar="ipsum"}, { foo="dolor", bar="amet"}]
新版本-添加了修饰代码,以确保结果集中没有重复的代码。
function trimString(s) {
var l=0, r=s.length -1;
while(l < s.length && s[l] == ' ') l++;
while(r > l && s[r] == ' ') r-=1;
return s.substring(l, r+1);
}
function compareObjects(o1, o2) {
var k = '';
for(k in o1) if(o1[k] != o2[k]) return false;
for(k in o2) if(o1[k] != o2[k]) return false;
return true;
}
function itemExists(haystack, needle) {
for(var i=0; i<haystack.length; i++) if(compareObjects(haystack[i], needle)) return true;
return false;
}
var objects = [
{
"foo" : "bar",
"bar" : "sit"
},
{
"foo" : "lorem",
"bar" : "ipsum"
},
{
"foo" : "dolor blor",
"bar" : "amet blo"
}
];
function searchFor(toSearch) {
var results = [];
toSearch = trimString(toSearch); // trim it
for(var i=0; i<objects.length; i++) {
for(var key in objects[i]) {
if(objects[i][key].indexOf(toSearch)!=-1) {
if(!itemExists(results, objects[i])) results.push(objects[i]);
}
}
}
return results;
}
console.log(searchFor('lo '));