ESLint错误使用Object.keys而不是for..in

时间:2017-08-21 13:38:32

标签: javascript

我正在处理下面的代码,它完全正常。但是,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

2 个答案:

答案 0 :(得分:1)

当您使用Object.keysforEach迭代键时,您将函数作为回调传递,因此return语句用于该回调函数而不是{{1} }。

您可以将其存储在外部变量中(通过searchObjforEach内访问),而不是从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);