使用 Lodash 删除数组中的元素

Removing elements in an array using Lodash

本文关键字:元素 数组 Lodash 删除 使用      更新时间:2023-09-26

我有这个数组:

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 它接受两个数组参数 A 和 B,并将返回另一个数组,其中包含 A 中不在 B 中的所有元素。

在你的情况下,你可以写

const fruits = ['Apple', 'Banana', 'Orange', 'Celery'];
const filteredFruits = _.difference(fruits, ['Apple', 'Banana', 'Orange']);

这将导致['Celery'].

问题不在于 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

使用要比较的值数组,并检查返回的索引是否大于 -1。这表示在集合中找到了评估的值。

_.remove( fruits, function ( fruit ) {
  return _.indexOf( [ "Apple", "Banana", "Orange" ], fruit ) >= 0;
});

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

采取的方法的问题在于,你没有将fruit与每根弦进行比较;相反,唯一发生的比较是fruit"Apple",之后你自己

强制字符串。

非空字符串强制true!!"Banana"),因此是真实的。因此,以下条件将始终在"香蕉"处短路(除非fruit严格等于 "Apple" ),返回true

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