过滤器数组修改原始数组本身

时间:2020-10-27 23:45:07

标签: javascript filter

有什么办法可以用filter修改原始数组,而不是返回一个新数组?
万一这是一个XY问题,其原因是我想在函数内部修改数组:

function diff(myArray, removeArray){

   // this does not work of course
   myArray = myArray.filter(x => !removeArray.includes(x));
    
}
let myArray = [1,2,3];
diff(myArray, [2,4]);   
console.log(myArray);  // should be [1,3] here

我知道我可以通过一些循环来删除元素,但是也许有一种更优雅,更有效的方法可以直接使用过滤器来做到这一点?

3 个答案:

答案 0 :(得分:1)

您始终可以过滤并清除数组并将其添加回去

function cleanUp (arr) {
  const temp = arr.filter(x => x % 2);
  arr.length = 0;
  arr.push(...temp)
}

var myArr = [1,2,3,4];
cleanUp(myArr);
console.log(myArr);

进行拼接

function cleanUp (arr) {
  arr.push(...arr.splice(0, arr.length).filter(x => x % 2))
}

var myArr = [1,2,3,4];
cleanUp(myArr);
console.log(myArr);

答案 1 :(得分:0)

并非如此,我认为手动进行迭代并删除未通过测试的元素是您可以执行以下操作的唯一方法:

function diff(myArray, removeArray) {
  for (let i = myArray.length; i >= 0; i--) {
    if (removeArray.includes(myArray[i])) {
      myArray.splice(i, 1);
    }
  }
}
let myArray = [1, 2, 3];
diff(myArray, [2, 4]);
console.log(myArray); // should be [1,3] here

这很丑。在几乎所有情况下,使用.filter返回一个新数组可能都是可取的-它不仅易于阅读,而且功能更多。 (通常,在避免不必要的突变时,代码更容易理解)

答案 2 :(得分:0)

除了@CertainPerformance答案之外,如果您确实需要此方法来修改原始数组,则始终可以覆盖Array.prototype方法并自己实现:

Array.prototype.filter = function(callback, context){
  for (var i = this.length; i >= 0; i--) {
    if (!callback.call(context, this[i], i, this)) {
        this.splice(i, 1);
    }
  }
};

请注意:this引用了调用者,在这种情况下,是所涉及的数组。

即使我也提倡反对它,但重用,维护和跟踪变得越来越困难。