我有很多类似的对象,像这样;
[ { "foo" : "bar", "bar" : "sit" }, { "foo" : "lorem", "bar" : "ipsum" }, { "foo" : "dolor", "bar" : "amet" } ]
我想用关键字搜索这些对象的值(而不是键),并返回在任何值中都包含关键字的对象数组。
因此,例如,使用关键字r,我将获得所有对象(对象#1中的“ baR”,对象#2中的“ loRem”和对象#3中的“ doloR”)。使用关键字lo,我将得到对象2和3(“ LOrem”和“ doLOr”),使用关键字,我将得到对象a1和3(“ bAr”和“ Amet”)。foo但是,使用关键字,我会得到一个空数组,因为“ foo”是键,并且在任何值中都没有找到(与“ bar”不同)……您明白了。
r
lo
a
foo
我将如何去做呢?在此先多谢!
像这样:
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 '));