我正在编写下面的代码,它工作得很好。但是,ESLint 建议使用 Object.keys
而不是 for..in
循环。我尝试迭代keys
,如果找到匹配则进行搜索然后返回对象。它适用于for..in
,但不适用于Object.keys。我尝试用 filter
替换 forEach
但对我不起作用。任何建议。
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
最佳答案
因为您并没有真正使用找到的对象,只是因为它在那里。如果您已经发现它与搜索查询匹配,则可以使用 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);
关于javascript - ESLint 错误使用 Object.keys 而不是 for..in,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45798589/