如何在JavaScript中同时从不同的索引中删除数组中的多个元素?

时间:2017-02-23 05:29:42

标签: javascript arrays

我有一个整数数组,我正在使用.push()方法添加。

我知道splice()方法在数组中添加/删除项目,并返回删除的项目。

但是有没有办法同时从不同索引的数组中删除多个元素?

我知道我们也可以使用filter()方法,但filter()方法会创建一个新数组,其中所有元素都通过我提供的函数实现的测试,这是我不想要的。

前: -

var array = [1,2,3,4,5];

我知道删除3和5我可以按照以下步骤操作: -

  
      
  1. array.splice(2,1);
  2.   
  3. array.splice(3,1);
  4.   

但是,如果不使用splice()方法两次,我可以一步完成吗?

4 个答案:

答案 0 :(得分:3)

如果您知道要删除的确切值,可以使用array.filter()

这会同时从不同索引的数组中删除多个元素。

案例中的例子:



var filtered = [1,2,3,4,5].filter(value => { return value !== 3 && value !== 5 });

console.log(filtered)




答案 1 :(得分:1)

您可以在解构赋值时使用尾随逗号来从数组中选择特定元素,将数组中的结果值分配给原始数组引用。



var array = [1,2,3,4,5];
{let [a,b,,c,,] = array; array = [a,b,c]};

console.log(array);




您可以在数组上使用对象解构来仅从数组中获取特定索引



var array = [1,2,3,4,5];
{let {0:a,1:b,3:c} = array; array = [a,b,c]};

console.log(array);




您还可以使用.forEach()迭代要匹配的元素数组,.indexOf().splice()以删除与数组中元素值匹配的元素



var array = [1,2,3,4,5];
[3, 5].forEach(p => array.splice(array.indexOf(p), 1));

console.log(array);




使用for..of循环,Array.prototype.findIndex()Array.prototype.splice()



var array = [1,2,3,4,5];
var not = [3, 5];
for (let n of not) array.splice(array.findIndex(v => v === n), 1);

console.log(array);




for..of循环使用Array.prototype.entries()Array.prototype.some()Array.prototype.splice()



var array = [1,2,3,4,5];
var not = [3,5];
for (let [k, p] of array.entries()) not.some(n => !(n-p)) && array.splice(k, 1);

console.log(array);




您还可以使用for循环,Object.assign()设置索引以保持在数组的开头,调用.splice()并将参数设置为- .length要从数组中删除的元素数



var array = [1,2,3,4,5];
var not = [3,5];
for (var o = {}, k = -1, i = 0; i < array.length; i++) {
  if (!not.some(n => n === array[i])) o[++k] = array[i];
}
Object.assign(array, o).splice(-not.length);

console.log(array);
&#13;
&#13;
&#13;

Array.prototype.reduce()Object.assign()

一起使用

&#13;
&#13;
var array = [1,2,3,4,5];
var not = [3,5];
Object.assign(array, array.reduce(([o, not, k], p) => 
  [Object.assign(o, !not.some(n => n === p) ? {[++k]:p} : void 0), not, k]
  , [{}, not, -1]).shift()
).splice(-not.length);

console.log(array);
&#13;
&#13;
&#13;

另一个选项,如果数字是唯一的,则使用Set.delete(),在解构分配时使用rest元素将Set对象转换为Array

&#13;
&#13;
var array = new Set;
var not = [3, 5];
for (let n = 1; n <= 5; n++) array.add(n);

for (let n of not) array.delete(n);
[...array] = array;

console.log(array); // `array = new Set(array)`
&#13;
&#13;
&#13;

答案 2 :(得分:1)

当您知道需要删除的特定值以及阵列较小时的硬编码:

var array = [1,2,3,4,5,6,7];
array.splice(2,3,4);
console.log(array);

答案 3 :(得分:1)

可能你可以这样做;

var          arr = [1,2,3,4,5,17,23,37,61,15],
itemsToGetRidOff = [3,17,15,1,23];
arr.reduceRight((_,e,i,a) => itemsToGetRidOff.includes(e) && a.splice(i,1),[]);
console.log(arr);