使用Lodash删除数组中的元素

bar*_*ard 23 javascript lodash

我有这个数组:

var fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
Run Code Online (Sandbox Code Playgroud)

我使用Lodash是remove这样的:

_.remove(fruits, function (fruit) {
  return fruit === 'Apple' || 'Banana' || 'Orange';
})
Run Code Online (Sandbox Code Playgroud)

结果是['Apple', 'Banana', 'Orange', 'Celery'],虽然我期待它['Apple', 'Banana', 'Orange'].为什么会这样?

Ama*_*dan 50

因为当fruit"Celery",你正在测试:

"Celery" === 'Apple' || 'Banana' || 'Orange'
Run Code Online (Sandbox Code Playgroud)

评估为

false || true || true
Run Code Online (Sandbox Code Playgroud)

是的true.

您无法使用该语法.要么做得很远:

_.remove(fruits, function (fruit) {
  return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange'
});
Run Code Online (Sandbox Code Playgroud)

或测试数组成员资格:

_.remove(fruits, function (fruit) {
  return _.indexOf(['Apple', 'Banana', 'Orange'], fruit) !== -1
});
Run Code Online (Sandbox Code Playgroud)

这不仅限于JavaScript,实际上是一个常见的错误(例如这个问题)

  • 为什么不使用`_.includes`而不是`_.indexOf`? (10认同)

小智 33

您可以使用_.pulllodash 2.0及更高版本中的方法

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

_.pull(fruits, 'Apple', 'Banana', 'Orange'); // ['Celery']

document.write(fruits);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)


Mou*_*ous 9

如果要从另一个集合中删除一组项目,则会有专门为此设置的集合操作.Lodash有https://lodash.com/docs/4.17.2#difference,它接受两个数组参数A和B,并返回另一个数组,其中包含A中不存在的所有A元素.

在你的情况下,你可以写

const fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
const filteredFruits = _.difference(fruits, ['Apple', 'Banana', 'Orange']);
Run Code Online (Sandbox Code Playgroud)

这将导致['Celery'].


nck*_*lvn 8

问题不在于Lo-Dash; 问题在于你的回调函数中的条件.这个:

return fruit === 'Apple' || 'Banana' || 'Orange';
Run Code Online (Sandbox Code Playgroud)

正确的.你需要实际比较fruit每个字符串:

return fruit === 'Apple' || fruit === 'Banana' || fruit === 'Orange';
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用另一个Lo-Dash函数使其更紧凑:

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

注意:在最新版本的Lo-Dash中,_.contains不推荐使用该功能.请用_.includes