我正在处理下面的代码,它完全正常。但是,ESLint建议使用Object.keys
而不是for..in
循环。我尝试迭代keys
,如果找到匹配则进行搜索然后返回对象。它适用于for..in
,但不适用于Object.keys。我尝试将forEach
替换为filter
,但对我不起作用。任何建议。
function searchObj (obj, query) {
// Object.keys(obj).forEach(function(key){
for (var key in obj) {
var value = obj[key];
if (typeof value === 'object') {
return searchObj(value, query);
}
if (typeof value === 'string' && value.toLowerCase().indexOf(query.toLowerCase()) > -1) {
return obj;
}
}
}
var demoData=[
{id:1,desc:{original:'trans1'},date:'2017-07-16'},
{id:2,desc:{original:'trans2'},date:'2017-07-12'},
{id:3,desc:{original:'trans3'},date:'2017-07-11'},
{id:4,desc:{original:'trans4'},date:'2017-07-15'}
];
var searchFilter = demoData.filter(function(obj){
return searchObj(obj, 'trans1');
});
console.log(searchFilter);
这是链接JS bin
答案 0 :(得分:1)
当您使用Object.keys
和forEach
迭代键时,您将函数作为回调传递,因此return
语句用于该回调函数而不是{{1} }。
您可以将其存储在外部变量中(通过searchObj
在forEach
内访问),而不是从forEach
回调中返回结果,而是将其分配到{{} 1}},然后返回其值。在这里,我为此创建了一个名为closure
的变量:
forEach

答案 1 :(得分:1)
因为你并没有真正使用找到的物体,所以它就在那里。您可以使用Array.prototype.some
来避免遍历obj
中的每个键,您已经发现它与搜索查询匹配。
function searchObj (obj, query) {
return Object.keys(obj).some(function(key) {
var value = obj[key];
if (typeof value === 'object') {
return searchObj(value, query);
}
return typeof value === 'string' && value.toLowerCase().indexOf(query.toLowerCase()) > -1;
});
}
var demoData=[
{id:1,desc:{original:'trans1'},date:'2017-07-16'},
{id:2,desc:{original:'trans2'},date:'2017-07-12'},
{id:3,desc:{original:'trans3'},date:'2017-07-11'},
{id:4,desc:{original:'trans4'},date:'2017-07-15'}
];
var searchFilter = demoData.filter(function(obj){
return searchObj(obj, 'trans1');
});
console.log(searchFilter);