在Javascript/jQuery中从数组中删除多个元素

175

我有两个数组。第一个数组包含一些值,而第二个数组包含应从第一个数组中删除的值的索引。例如:

var valuesArr = new Array("v1","v2","v3","v4","v5");   
var removeValFromIndex = new Array(0,2,4);

我想从valuesArr中删除索引为0,2,4的值。 我认为使用内置的splice方法可能有所帮助,所以我想到了以下方法:

$.each(removeValFromIndex,function(index,value){
    valuesArr.splice(value,1);
});

但这并没有起作用,因为在每次splice之后,valuesArr中的值的索引都会改变。我可以通过使用临时数组并将所有值复制到第二个数组来解决这个问题,但我想知道是否有任何本地方法可以传递多个索引以从数组中删除值。

我更喜欢使用jQuery解决方案。(不确定是否可以在这里使用grep

27个回答

0
你可以尝试使用 Lodash js 库函数(_.forEach()_.remove())。我使用这种技术从表格中删除多行。
let valuesArr = [
    {id: 1, name: "dog"}, 
    {id: 2, name: "cat"}, 
    {id: 3, name: "rat"}, 
    {id: 4, name: "bat"},
    {id: 5, name: "pig"},
]; 
let removeValFromIndex = [
    {id: 2, name: "cat"}, 
    {id: 5, name: "pig"},
]; 
_.forEach(removeValFromIndex, (indi) => {
    _.remove(valuesArr, (item) => {
        return item.id === indi.id;
    });
})
console.log(valuesArr)
/*[
    {id: 1, name: "dog"},  
    {id: 3, name: "rat"}, 
    {id: 4, name: "bat"},
];*/ 

在修改数组之前,不要忘记克隆 (_.clone(valuesArr)[...valuesArr])


0
一个选择是创建一个缩减器,通过返回非选择值的索引来验证它,然后对其进行排序。

 var valuesArr = new Array("v1", "v2", "v3", "v4", "v5");
  var r = new Array(0, 2, 4);

  const data = valuesArr
    .reduce((p, c, i) => (!r.includes(i) ? [...p, c] : p), [])
    .sort((a, b) => b - a);

  console.log(data);


0
这更像是对@nnnnnn的答案进行微调,但我还会删除潜在的重复索引,否则这将导致额外的行被删除:
function arrayUnique(arr) {
    return arr.filter((value, index, array) => array.indexOf(value) === index);
}

function arrayDeleteMulti(arr, idxSet) {

    idxSet = arrayUnique(idxSet).sort(function(a,b){ return a-b; });
    
    for (var i = idxSet.length -1; i >= 0; i--)
        arr.splice(idxSet[i],1);

    return arr
}

所以在这个测试中

var arr = [`v0`, `v1`, `v2`, `v3`, `v4`, `v5`];
console.log(arrayDeleteMulti(arr, [4,4,4,0,2]))

我们确实得到了

[ "v1", "v3", "v5" ]

-1
你可以尝试使用delete array[index]。这不会完全删除元素,而是将其值设置为undefined

谢谢,但我想要移除这些元素。 - Ajinkya

-1
removeValFromIndex.forEach(function(toRemoveIndex){
    valuesArr.splice(toRemoveIndex,1);
});

1
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Mark Rotteveel

-2

对于多个项目或唯一项目:

我建议您使用Array.prototype.filter

如果您已经知道索引,请不要使用indexOf!

var valuesArr = ["v1","v2","v3","v4","v5"];
var removeValFrom = [0, 2, 4];

valuesArr = valuesArr.filter(function(value, index) {
     return removeValFrom.indexOf(index) == -1;
}); // BIG O(N*m) where N is length of valuesArr and m is length removeValFrom

操作:

使用哈希表... 使用Array.prototype.map

  var valuesArr = ["v1","v2","v3","v4","v5"];
  var removeValFrom = {};
  ([0, 2, 4]).map(x=>removeValFrom[x]=1); //bild the hash.
  valuesArr = valuesArr.filter(function(value, index) {
      return removeValFrom[index] == 1;
  }); // BIG O(N) where N is valuesArr;

-2
你可以从数组构建一个Set,然后再从这个集合创建一个数组。
const array = [1, 1, 2, 3, 5, 5, 1];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // Result: [1, 2, 3, 5]

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