私はこの配列を持っています:
var fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
そして、私はLodashのremove
を次のように使用します。
_.remove(fruits, function (fruit) {
return fruit === 'Apple' || 'Banana' || 'Orange';
})
結果は['Apple', 'Banana', 'Orange', 'Celery']
、私はそれが['Apple', 'Banana', 'Orange']
。これはなぜですか?
なぜならfruit
が"Celery"
、あなたはテストしています:
"Celery" === 'Apple' || 'Banana' || 'Orange'
評価する
false || true || true
これはtrue
です。
その構文は使用できません。長い道のりでそれを行うか:
_.remove(fruits, function (fruit) {
return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange'
});
または、アレイメンバーシップをテストします。
_.remove(fruits, function (fruit) {
return _.indexOf(['Apple', 'Banana', 'Orange'], fruit) !== -1
});
これはJavaScriptに限定されず、実際にはよくある間違いです(例 この質問 )
Lodash 2.0以降の_.pull
メソッドを使用できます
var fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
_.pull(fruits, 'Apple', 'Banana', 'Orange'); // ['Celery']
document.write(fruits);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js"></script>
別のセットからアイテムのセットを削除する場合は、そのために特に意図されたセット操作があります。 Lodashには https://lodash.com/docs/4.17.2#difference があり、2つの配列パラメーターAとBを取り、BにないAのすべての要素を含む別の配列を返します。
あなたの場合、あなたは書くことができます
const fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
const filteredFruits = _.difference(fruits, ['Apple', 'Banana', 'Orange']);
結果は['Celery']
。
問題はLo-Dashにはありません。問題は、コールバック関数内の条件にあります。この:
return fruit === 'Apple' || 'Banana' || 'Orange';
notは正しいです。実際にfruit
を各文字列と比較する必要があります。
return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange';
または、別のLo-Dash関数を使用して、もう少しコンパクトにすることができます:
_.remove(fruits, function (fruit) {
return _.contains(['Apple', 'Banana', 'Orange'], fruit);
})
注:Lo-Dashの最新バージョンでは、_.contains
関数は非推奨です。使ってください - _.includes
比較する値の配列を使用し、-1より大きい返されたインデックスを確認します。これは、評価された値がコレクションで見つかったことを示します。
_.remove( fruits, function ( fruit ) {
return _.indexOf( [ "Apple", "Banana", "Orange" ], fruit ) >= 0;
});
あるいは、 lo-dash's _.contains
method ブール値の応答を取得します。
あなたが取ったアプローチの問題は、fruit
をこれらの文字列のそれぞれと比較していないことでした。代わりに、行われる唯一の比較はfruit
対"Apple"
、その後、文字列をすべて独自に強制していました。
空でない文字列はtrue
(!!"Banana"
)、およびtruthyです。したがって、次の条件は常に「バナナ」で短絡します(fruit
が厳密に"Apple"
)、true
を返します:
return fruit === "Apple" || 'Banana' || "Orange";