lodash的pullall方法可高效移除数组中多个特定值,它直接修改原数组,接受一个待操作数组和一个包含需移除值的数组作为参数,例如\_.pullall(fruits, ['apple', 'banana'])会从fruits中移除所有匹配项;与pull的区别在于参数形式:pull接收多个独立值作为参数,如\_.pull(array, 'a', 'c'),而pullall接收一个值数组,如\_.pullall(array, ['a', 'c']),更适合动态值列表的场景;若不想修改原数组,应使用\_.without或原生filter方法,前者需配合解构操作符使用,如\_.without(originalarray, ...valuestoremove),后者更灵活,支持复杂条件过滤,尤其适用于对象数组;处理对象数组时pullall存在局限,因其基于严格相等(===)比较,只能通过传入数组中实际存在的对象引用才能成功移除,若按属性匹配删除应选用\_.remove或filter配合判断函数,如\_.remove(objects, obj => idstoremove.includes(obj.id))或objects.filter(obj => !idstoremove.includes(obj.id)),以避免引用不一致问题并提升代码可读性。

js 中要高效移除数组里的多个特定值,Lodash 库的
pullAll
Lodash 的
_.pullAll(array, values)
array
values
举个例子,假设你有一个水果列表,想把苹果和香蕉都从里面拿走:
const _ = require('lodash'); // 别忘了安装 Lodash:npm install lodash
let fruits = ['apple', 'banana', 'orange', 'apple', 'grape', 'banana'];
const valuesToRemove = ['apple', 'banana'];
_.pullAll(fruits, valuesToRemove);
console.log(fruits); // 输出: [ 'orange', 'grape' ]你会发现
fruits
pullAll
pull
很多人在 Lodash 中会遇到
pull
pullAll
pull
pullAll
比如说,你要移除一个数组里的 'a' 和 'c':
使用
pull
_.pull(array, 'a', 'c')
pullAll
_.pullAll(array, ['a', 'c'])
看,参数的形态就不一样了。
pull
pullAll
let letters1 = ['a', 'b', 'c', 'a', 'd'];
_.pull(letters1, 'a', 'c');
console.log('pull 后的结果:', letters1); // 输出: pull 后的结果: [ 'b', 'd' ]
let letters2 = ['a', 'b', 'c', 'a', 'd'];
_.pullAll(letters2, ['a', 'c']);
console.log('pullAll 后的结果:', letters2); // 输出: pullAll 后的结果: [ 'b', 'd' ]虽然结果可能一样,但当你要移除的值是动态生成的一个列表时,
pullAll
pull
pullAll
pullAll
Lodash 也提供了不修改原数组的方法。对于移除特定值,
_.without
const _ = require('lodash');
let originalNumbers = [1, 2, 3, 4, 5, 2, 6];
const valuesToExclude = [2, 4];
// 使用 _.without
let newNumbersWithout = _.without(originalNumbers, ...valuesToExclude); // 注意这里需要解构赋值
console.log('_.without 后的新数组:', newNumbersWithout); // 输出: _.without 后的新数组: [ 1, 3, 5, 6 ]
console.log('原数组是否改变:', originalNumbers); // 输出: 原数组是否改变: [ 1, 2, 3, 4, 5, 2, 6 ]当然,你也可以直接用原生的 JavaScript
filter
includes
pullAll
without
let originalItems = [
{ id: 1, name: 'Item A' },
{ id: 2, name: 'Item B' },
{ id: 3, name: 'Item C' }
];
const itemsToRemoveIds = [1, 3];
// 使用 filter 和 includes
let filteredItems = originalItems.filter(item => !itemsToRemoveIds.includes(item.id));
console.log('filter 后的新数组:', filteredItems);
// 输出: filter 后的新数组: [ { id: 2, name: 'Item B' } ]
console.log('原数组是否改变:', originalItems);
// 输出: 原数组是否改变: [ { id: 1, name: 'Item A' }, { id: 2, name: 'Item B' }, { id: 3, name: 'Item C' } ]这种方式的灵活性在于,你可以自定义过滤的逻辑,不仅仅是简单的值相等。比如说,移除所有
id
filter
pullAll
当你在数组里处理对象时,
pullAll
===
想象一下这个场景:
const _ = require('lodash');
let users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 3, name: 'Charlie' }
];
// 尝试移除 Bob,但传入的是一个新的对象实例
const bobToRemove = { id: 2, name: 'Bob' };
_.pullAll(users, [bobToRemove]);
console.log('尝试移除 Bob (新对象) 后的 users:', users);
// 输出: 尝试移除 Bob (新对象) 后的 users: [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' } ]
// 发现 Bob 还在,因为传入的 bobToRemove 和数组里的 { id: 2, name: 'Bob' } 是不同的内存地址。要让
pullAll
let users2 = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 3, name: 'Charlie' }
];
const actualBob = users2[1]; // 获取数组中 Bob 的实际引用
_.pullAll(users2, [actualBob]);
console.log('移除实际 Bob 引用后的 users2:', users2);
// 输出: 移除实际 Bob 引用后的 users2: [ { id: 1, name: 'Alice' }, { id: 3, name: 'Charlie' } ]
// 这次就成功了。所以在处理对象数组时,如果你的目标是根据对象的某个属性(比如
id
pullAll
_.remove
filter
使用
_.remove
let products = [
{ id: 101, name: 'Laptop' },
{ id: 102, name: 'Mouse' },
{ id: 103, name: 'Keyboard' }
];
const idsToRemove = [101, 103];
_.remove(products, product => idsToRemove.includes(product.id));
console.log('_.remove 后的 products:', products);
// 输出: _.remove 后的 products: [ { id: 102, name: 'Mouse' } ]或者使用
filter
let articles = [
{ id: 201, title: 'JS Basics' },
{ id: 202, title: 'CSS Advanced' },
{ id: 203, title: 'React Hooks' }
];
const idsToFilterOut = [201, 203];
let remainingArticles = articles.filter(article => !idsToFilterOut.includes(article.id));
console.log('filter 后的 remainingArticles:', remainingArticles);
// 输出: filter 后的 remainingArticles: [ { id: 202, title: 'CSS Advanced' } ]
console.log('原 articles 数组:', articles);
// 输出: 原 articles 数组: [ { id: 201, title: 'JS Basics' }, { id: 202, title: 'CSS Advanced' }, { id: 203, title: 'React Hooks' } ]在我看来,处理对象数组时,使用带判断函数的
_.remove
filter
以上就是js 如何用pullAll移除数组中的多个值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号