2017-10-04 19 views
2

私は(フィルタ)を使用している別のJSON配列条件を使用してJSON配列をフィルタリングしようとしています。ここで別のJSON配列ノードを使用してJSON配列を検索するjs

は私のコードは次のとおりです。たとえば

function filterArray(object, criteria){ 
    return object.filter(function(obj){ 
     for(var i=0;i<criteria.length;i++){ 
      let criteriaEle = criteria[i]; 
      return Object.keys(criteriaEle).forEach(function(key){ 
       if(obj[key] == criteriaEle[key]){ 
        return obj; 
       } 
      }) 
     } 
    }) 
} 

object = [{type:1,company:1,color:0,name:a},{type:2,company:1,color:0,name:b},{type:1,company:3,color:0,name:c},{type:4,company:1,color:0,name:d},{type:1,company:1,color:1,name:e}] 

criteria = [{type:1,company:1,color:0},{type:1,company:1,color:1}] 

私は関数にこれら二つの配列を与えるのであれば、それは私はありません

obj = [{{type:1,company:1,color:0,name:a},{type:1,company:1,color:1,name:e}}] 

を返す必要があります私はどこで間違っているのか確かめてください。助けてください。

更新: また、obj.typeまたはobj.companyまたはobject.colorをパラメータとして使用して検索したいとは思いません。自分のコードをメンテナンス可能にしたい場合や、将来、より多くの基準が追加されます。ここで

+0

**アンダースコア.js **の使用はどうですか?ここで 'where'関数を使うことができます。 :) –

+1

@HannahMayステートメントで論理ORを使用することはできません。 –

答えて

3

const data = [{type:1,company:1,color:0,name:'a'},{type:2,company:1,color:0,name:'b'},{type:1,company:3,color:0,name:'c'},{type:4,company:1,color:0,name:'d'},{type:1,company:1,color:1,name:'e'}]; 
 

 
const criteria = [{type:1,company:1,color:0},{type:1,company:1,color:1}]; 
 

 
function checkCriteria(obj) { 
 
    return criteria.some(criterion => { 
 
    for (const key in criterion) { 
 
     if (criterion[key] !== obj[key]) { 
 
     return false; 
 
     } 
 
    } 
 
    return true; 
 
    }); 
 
} 
 

 
const filtered = data.filter(checkCriteria); 
 

 
console.log('Filtered array: ', filtered);

一つの解決策です。ここで

はクロージャの概念を説明するために、別のスニペットを追加して、コメントをもとにいくつかの参照

Array.some Array.filter

です。

const data = [{type:1,company:1,color:0,name:'a'},{type:2,company:1,color:0,name:'b'},{type:1,company:3,color:0,name:'c'},{type:4,company:1,color:0,name:'d'},{type:1,company:1,color:1,name:'e'}]; 
 

 
function createCriteriaValidationFunction(criteria) { 
 
    return function checkCriteria(obj) { 
 
    return criteria.some(criterion => { 
 
     for (const key in criterion) { 
 
     if (criterion[key] !== obj[key]) { 
 
      return false; 
 
     } 
 
     } 
 
     return true; 
 
    }); 
 
    } 
 
} 
 

 
const criteria = [{type:1,company:1,color:0},{type:1,company:1,color:1}]; 
 

 
const filtered = data.filter(createCriteriaValidationFunction(criteria)); 
 

 
console.log('Filtered array: ', filtered);

それは前に、しかし、基準はファイルで定義されたのと同じ考え方です。今回は、基準を外部で定義して関数に渡すことができます。そのトリックは、渡された基準とクロージャーで使用可能な条件で、即座にcheckCriteria関数を作成することです。どちらの場合も、criteria変数はcheckCriteriaが実行されるスコープで使用できます。

+0

申し訳ありませんが、自分のコードを私の設定から構成可能にしたいと書いていました。だから私は "obj.type"や "obj.company"をやりたいとは思っていません。 –

+0

@AnuragBhardwajソリューションを更新しました。 –

+0

私はArray.filterが新しく、data.filter(checkCriteria)からcheckCriteria(obj)関数にcriteriaオブジェクトを渡す必要がある場合、どうすればよいのか理解しようとしていますか? –

関連する問題