2017-09-06 12 views
1

私は(jsまたはjqueryで)オブジェクトの配列をフィルタリングし、特定のプロパティ名を持つオブジェクトの配列を返そうとしています。オーバーfind開始の各反復とは、すべてやり直すarrを定義するので、それは仕事をdoesntのがJS - プロパティ値の配列によるオブジェクトの配列とフィルタリングされたオブジェクトの配列を返す

result = [{a:1}, {a:2}] 

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}] 
var vals = [1, 2] 

    function callback(obj) { 
     var arr = arr || [] 
     console.log(arr) 
     $.each(vals, function(key, val) { 
      if (val == obj.a) { 
       arr.push(obj) 
      } 
     }) 
    } 

    var result = objs.find(callback); 

    console.log(">>>", result) 

期待される結果は次のとおりです。

は、私はこのよう filterfind機能を試してみました。

私は都合の良いことに、2つの入れ子になっています$.each() - オブジェクトの配列を反復処理し、プロパティ値の配列を反復処理することはできますが、最後のオプションとして考えると、よりエレガントで短いものを探します。皆さんはどんなアイデアを持っていますか?

答えて

0

filterindexOfで行うことができます。

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}] 
 
var vals = [1, 2] 
 

 

 
function filterByValue(source, allowedValues) { 
 
    // Return the result of the filter. 
 
    return source.filter(item => { 
 
    // Returns true when `a` is present in vals (index > -1); otherwise it returns false. 
 
    return allowedValues.indexOf(item.a) > -1; 
 
    }); 
 
} 
 

 
const 
 
    filteredArray = filterByValue(objs, vals); 
 

 
console.log(filteredArray)

+0

@DZackフェアポイントを、あなたのソリューションを楽しみにしています。 – Thijs

0

タイスの答えは動作しますが、vals配列が大きくなるようunperformant取得します。 O(n)の複雑さを取得するには、allowedValues配列のうちのセットを構築できます。

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}] 
 
var vals = [1, 2] 
 

 
function filterByValue(source, allowedValues) { 
 

 
    allowedValues = new Set(allowedValues) 
 
    // Return the result of the filter. 
 

 
    return source.filter(item => { 
 
    // Returns true when `a` is present in vals, otherwise it returns false. 
 
     return allowedValues.has(item.a); 
 
    }); 
 
} 
 
const filteredArray = filterByValue(objs, vals); 
 

 
console.log(filteredArray)

+0

@Kalregこれがあなたの質問に答えるなら、それを受け入れられた答えとしてマークできますか? – DZack

関連する問題