我有一个类似这样的同构对象数组;
[
{
"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“是一个键,并且在任何值中都找不到(与”foo
“不同)……你明白了吧。
我该怎么做呢?提前谢谢你!
发布于 2016-11-30 22:18:59
所有其他的旧答案都使用for in循环,现代的JavaScript都有Object.keys
。将它与一些、包含和过滤器结合起来,它会更好一些。
var a = [{
name: 'xyz',
grade: 'x'
}, {
name: 'yaya',
grade: 'x'
}, {
name: 'x',
frade: 'd'
}, {
name: 'a',
grade: 'b'
}];
function filterIt(arr, searchKey) {
return arr.filter(function(obj) {
return Object.keys(obj).some(function(key) {
return obj[key].includes(searchKey);
})
});
}
console.log("find 'x'", filterIt(a,"x"));
console.log("find 'a'", filterIt(a,"a"));
console.log("find 'z'", filterIt(a,"z"));
或使用ES6
function filterIt(arr, searchKey) {
return arr.filter(obj => Object.keys(obj).some(key => obj[key].includes(searchKey)));
}
发布于 2011-12-15 16:41:01
search
函数将返回包含包含搜索查询的值的所有对象
function search(arr, s){
var matches = [], i, key;
for( i = arr.length; i--; )
for( key in arr[i] )
if( arr[i].hasOwnProperty(key) && arr[i][key].indexOf(s) > -1 )
matches.push( arr[i] ); // <-- This can be changed to anything
return matches;
};
// dummy data
var items = [
{
"foo" : "bar",
"bar" : "sit"
},
{
"foo" : "lorem",
"bar" : "ipsum"
},
{
"foo" : "dolor",
"bar" : "amet"
}
];
var result = search(items, 'lo'); // search "items" for a query value
console.log(result); // print the result
发布于 2016-11-30 22:23:12
这是一个建议,它使用键(如果给定)或对象的所有属性来搜索值。
function filter(array, value, key) {
return array.filter(key
? a => a[key] === value
: a => Object.keys(a).some(k => a[k] === value)
);
}
var a = [{ name: 'xyz', grade: 'x' }, { name: 'yaya', grade: 'x' }, { name: 'x', frade: 'd' }, { name: 'a', grade: 'b' }];
console.log(filter(a, 'x'));
console.log(filter(a, 'x', 'name'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
https://stackoverflow.com/questions/8517089
复制相似问题