web-dev-qa-db-ja.com

Lodashを使用して配列内の要素を削除する

私はこの配列を持っています:

var fruits = ['Apple', 'Banana', 'Orange', 'Celery'];

そして、私はLodashのremoveを次のように使用します。

_.remove(fruits, function (fruit) {
  return fruit === 'Apple' || 'Banana' || 'Orange';
})

結果は['Apple', 'Banana', 'Orange', 'Celery']、私はそれが['Apple', 'Banana', 'Orange']。これはなぜですか?

23
bard

なぜなら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に限定されず、実際にはよくある間違いです(例 この質問

50
Amadan

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>
33
gustavogelf

別のセットからアイテムのセットを削除する場合は、そのために特に意図されたセット操作があります。 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']

8
Mouscellaneous

問題は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

8
ncksllvn

比較する値の配列を使用し、-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";
2
Sampson