2017-08-21 9 views
1

私は以下のコードで動作しています。しかし、ESLintはfor..inループの代わりにObject.keysを使用することを提案しています。私はkeysを反復しようとしましたが、一致するものが見つかった場合は検索を行い、オブジェクトを返します。 for..inでは動作しますが、Object.keysでは動作しません。私はforEachfilterと置き換えようとしましたが、私にとってはうまくいきませんでした。助言がありますか。ここESLintエラーはfor.inの代わりにObject.keysを使用します

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

あなたはそれがある方法をあなたのコードに満足している場合は理由だけで、そのルールをオフにしませんか?彼らは単なるガイドライン/誰かの個人的な意見であり、コードはどのように書かれているべきか、何かが石ではない。 – Andy

+2

'Object.keys(...).find'や' for(... of Object.keys(...)) 'を試すことができますが、正に[あなたのループは問題ありません](https://stackoverflow.com/a/45014721/ 1048572)。そのes-lintルールを無効にしてください! – Bergi

+0

'for..in'を使用するのではなく、それが唯一の最良の方法であれば、私たちはどうすればよいのでしょうか? –

答えて

1

:ここで私はそのためfoundObjという変数を作成します。 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);

+0

助けてくれてありがとう。 –

+1

@MuraliPrasanth問題ありません。最近のランタイムを使用している場合は、 'Object.values'を使用して、値を手動でさらにアクセスして、' Object.keys'の代わりにすべての値の配列を取得できます。 –

1

あなたがキーを反復処理するforEachObject.keysを使用する場合、あなたはコールバックとしての機能を渡しているので、return文ではなくsearchObjのコールバック関数のためのものです。

代わりforEachコールバックからの結果を返す、あなたは、(closureによってforEach内部アクセス)外部変数に格納forEachでそれを割り当て、その値を返すことができます。あなたは本当にそれがあるだけで、実際見つかったオブジェクトを使用していないので

function searchObj (obj, query) { 
 
    var foundObj = null; 
 

 
    Object.keys(obj).forEach(function(key) { 
 
    var value = obj[key]; 
 
    if (typeof value === 'object') { 
 
     foundObj = searchObj(value, query); 
 
    } 
 
    if (typeof value === 'string' && value.toLowerCase().indexOf(query.toLowerCase()) > -1) { 
 
     foundObj = obj; 
 
    } 
 
    }); 
 

 
    return foundObj; 
 
} 
 

 
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);

+1

助けてくれてありがとう@Alberto –

関連する問題