使用 Lodash 删除数组中的元素

28

我有这个数组:

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

我使用 Lodash 的 remove 方法,代码如下:

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

结果是['Apple', 'Banana', 'Orange', 'Celery'],但我预期的是['Apple', 'Banana', 'Orange']。为什么会这样呢?

5个回答

57

因为当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,实际上这是一个常见的错误(例如此问题


12
为什么不使用_.indexOf而是使用_.includes呢? - AJ Richardson

37
您可以使用 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>


13
如果您想从另一个集合中移除一组项目,可以使用特定于此目的的集合操作。Lodash具有https://lodash.com/docs/4.17.2#difference函数,它接受两个数组参数A和B,并返回另一个数组,其中包含所有不在B中的A元素。
在您的情况下,您可以编写:
const fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
const filteredFruits = _.difference(fruits, ['Apple', 'Banana', 'Orange']);

这将导致['Celery']


10

问题并不在于Lo-Dash库;你的问题在于回调函数中的条件语句。这段代码:

return fruit === 'Apple' || 'Banana' || 'Orange';

不正确。您需要实际将fruit与每个字符串进行比较:

return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange';

或者,你可以使用另一个 Lo-Dash 函数让它更加紧凑:

_.remove(fruits, function (fruit) {
  return _.contains(['Apple', 'Banana', 'Orange'], fruit);
})

注意:在最新版本的 Lo-Dash 中,_.contains 函数已被弃用。请使用 _.includes


2
使用一个值数组作为比较对象,检查返回的索引是否大于-1。这表示集合中存在被评估的值。
_.remove( fruits, function ( fruit ) {
  return _.indexOf( [ "Apple", "Banana", "Orange" ], fruit ) >= 0;
});

或者您可以使用Lo-Dash的_.contains方法来获取布尔响应。

你采取的方法的问题在于你没有将fruit和每一个字符串进行比较;相反,唯一进行的比较是fruit"Apple"的比较,之后你在强制转换字符串。

非空字符串会被强制转换为true!!"Banana"),因此,以下条件始终会在“Banana”处短路(除非fruit严格等于"Apple"),返回true

return fruit === "Apple" || 'Banana' || "Orange";

1
注意:Lodash不再使用函数“_.contains”。它曾经是“_.includes”的别名,但自3.10.0起不再使用。请改用“_.includes”。https://github.com/mgonto/restangular/issues/1298 - Alex Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接