2017-05-01 8 views
0

Lodashを使用して配列をフィルタリングしようとしています。問題は、私の主な配列の中で、配列要素のいくつかはオブジェクトであり、いくつかは配列内のオブジェクトです。両方のシナリオを処理するフィルタを1つ使用したいと思います。最初にvarを使用してコードを試したところ、インシデント番号270188929しか見つかりませんでしたが、var秒でコードを試してみると、インシデント番号370188929しか見つかりませんでした。両方を処理するネストされたオブジェクト定義でフィルターを書くことは可能ですか?あるいは私は機能が必要ですか?そうです、どのような機能が働きますか?ここでLodashでネストされたオブジェクトをフィルタリングする - 不整合な結果を得る

私のコードです:

var array = [{ 
"category": "test", 
"incidentInformation": { 
    "incidentNumber": "270188929", 
}, 
"numberInformation": { 
    "number": "1", 
    "type": "moderate", 
}, 
}, { 
"category": "test2", 
"incidentInformation": { 
    "incidentNumber": "370188929", 
}, 
"numberInformation": [{ 
    "number": "1", 
    "type": "moderate", 
}, { 
    "number": "1", 
    "type": "moderate", 
}] 
}]; 

var first = _.filter(array, { 
numberInformation: { 
    type: "moderate" 
} 
}); 

var second = _.filter(array, { 
numberInformation: [{ 
    type: "moderate" 
}] 
}); 
+0

ベストアンサーにしてください –

答えて

0

を使用することができます。

var result = _.filter(array, isModerate); 

はあなたのための述語を返す関数を作成することができ、それは、より汎用的にするには

var isOfType = function(type) { 

    return function(item){ 
     return item.numberInformation.type == type || 
       _.some(item.numberInformation, {type: type}); 
    } 
} 

var result = _.filter(array, isOfType('moderate')); 
+0

私は両方のreturn文で=の代わりに==を使うことを意味すると思います。この例では、両方のreturn文(=とwith ==)が機能しましたが、完全なアプリケーションで試してみると、=がデータを変更しました。これを最良の答えとして選んだのは、いったん私が==に変更されたからです。また、私はこの答えがもっと簡単だと思った。そして私はジェネリック関数に感謝します。 – GuitarViking

+0

私は恥ずべきで私の頭をぶら下げています:)。スクールボーイエラー。それを指摘してくれてありがとう。 –

0
var first= _.filter(array, function(o) { 
     return o.numberInformation.type == 'moderate'; 
    }); 



    var second = _.filter(array, function (o) { 
     return _.some(o.numberInformation, { 'type': 'moderate' }); 
    }); 
+0

この回答はうまくいきましたが、オブジェクトである配列要素と配列内のオブジェクトである配列要素の両方を処理するフィルタは1つありません。この回答は、私のコードがうまくいかなかった理由を説明するのに役立ちます。 – GuitarViking

0

あなたがオブジェクトのリストをフィルタリングするために任意のライブラリを必要としません。

var isModerate = function(item){ 
    return item.numberInformation.type == 'moderate' || 
      _.some(item.numberInformation, {type: 'moderate'}); 
} 

そして、フィルタ(またはどこ他にあなたがそれを必要とするかもしれない)のそれを使用する:あなたは、単にそれが述語に緩やかなことが何であるかをカプセル化しないのはなぜ filter()方法

var matchingItems = array.filter(function(item) { 
    return item.numberInformation.type == 'moderate'; 
}); 
+0

この回答はうまくいかなかった。それは最初の事件番号を返すだけでした。 – GuitarViking

1

あなたは、単一のフィルタに2つの基準を組み合わせたい場合は、私がcond()をお勧めします:

_.filter(array, _.cond([ 
    [v => v.numberInformation.type === 'moderate', _.stubTrue], 
    [v => _.some(v.numberInformation, { type: 'moderate' }), _.stubTrue]] 
)); 

cond()に渡されたペアは機能が続き、条件関数です。その考えは、条件が真実を返すか、尽きるまで条件を評価し続けるということです。何かが見つかると、trueの値がフィルタに返されます。

このアプローチを使用すると、宣言的なロジックが維持されやすくなります。

+0

この回答はうまくいった。私はGruff Bunnyの答えが気に入っていたので、私はそれを選んでいませんでした。私は理解しやすく、他の状況でも使用できる汎用的な機能を提供していました。 _cond()メソッドのメリットを説明できますか? – GuitarViking

関連する問題