JS 在对象值中搜索 [英] JS search in object values
问题描述
我有一个像这样的同类对象数组;
<预><代码>[{"foo" : "酒吧",酒吧":坐"},{"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 对象 = [{"foo" : "酒吧",酒吧":坐"},{"foo" : "lorem","bar" : "ipsum"},{"foo" : "dolor","bar" : "amet"}];var 结果 = [];var toSearch = "lo";for(var i=0; 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;返回 s.substring(l, r+1);}函数比较对象(o1,o2){var k = '';for(k in o1) if(o1[k] != o2[k]) 返回假;for(k in o2) if(o1[k] != o2[k]) 返回假;返回真;}功能项目存在(干草堆,针){for(var i=0; i<haystack.length; i++) if(compareObjects(haystack[i],needle)) return true;返回假;}var 对象 = [{"foo" : "酒吧",酒吧":坐"},{"foo" : "lorem","bar" : "ipsum"},{"foo" : "dolor blor","bar" : "amet blo"}];函数 searchFor(toSearch) {var 结果 = [];toSearch = trimString(toSearch);//修剪它for(var i=0; i
I have an array of homogeneous objects like so;
[
{
"foo" : "bar",
"bar" : "sit"
},
{
"foo" : "lorem",
"bar" : "ipsum"
},
{
"foo" : "dolor",
"bar" : "amet"
}
]
I'd like to search these objects' values (not keys) with a keyword, and return an array of objects that contain the keyword in any of the values.
So for example, with a keyword r
, I would get all the objects ("baR" in object #1, "loRem" in object #2 and "doloR" in object #3). With a keyword lo
, I would get objects 2 and 3 ("LOrem" and "doLOr"), with a
, I'd get objects 1 and 3, ("bAr" and "Amet"). With the keyword foo
however, I would get an empty array, since "foo" is a key, and isn't found in any of the values (unlike "bar")... you get the idea.
How would I go about doing this? Thanks a lot in advance!
Something like this:
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]);
}
}
}
The results array will contain all matched objects.
If you search for 'lo', the result will be like:
[{ foo="lorem", bar="ipsum"}, { foo="dolor", bar="amet"}]
NEW VERSION - Added trim code, code to ensure no duplicates in result set.
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 '));
这篇关于JS 在对象值中搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!