JavaScript - 带有突变的过滤器数组

Mou*_*iri 4 javascript ecmascript-6

我想通过保留相同的数组而不创建新数组来过滤数组。

Array.filter()

getFiltersConfig() {
  return this.config.filter((topLevelConfig) => topLevelConfig.name !== 'origin')
}
Run Code Online (Sandbox Code Playgroud)

通过按值过滤而不返回新数组来获得相同结果的最佳方法是什么?

Kei*_*ith 5

为了完整起见,我认为展示一个变异的数组变体可能是有意义的。

下面是一个带有简单函数的片段mutationFilter,这将直接过滤数组,注意在这个函数中循环是反向的,这是一种删除带有变异数组的项目的技术。

还有一些测试来展示如何Array.filter创建一个新数组,mutationFilter但没有。

尽管在大多数情况下创建一个新数组Array.filter通常是您想要的。使用变异数组的一个优点是,您可以通过引用传递数组,而无需将数组包装在另一个对象中。另一个优势当然是内存,如果你的数组很大,内联过滤会占用更少的内存。

let arr = ['a','b','a'];
let ref = arr; //keep reference of original arr

function mutationFilter(arr, cb) {
  for (let l = arr.length - 1; l >= 0; l -= 1) {
    if (!cb(arr[l])) arr.splice(l, 1);
  }
}

const cond = x => x !== 'a';

const filtered = arr.filter(cond);
mutationFilter(arr, cond);

console.log(`ref === array -> ${ref === arr}`);
console.log(arr);

console.log(`ref === filtered -> ${ref === filtered}`);
console.log(filtered);
Run Code Online (Sandbox Code Playgroud)


Isa*_*aac -6

不确定为什么你想要进行突变,但如果你真的想要这样做,也许可以将其分配回自身?

let arr = ['a','b','a'];

arr = arr.filter(x => x !== 'a');

console.log(arr)
Run Code Online (Sandbox Code Playgroud)

  • @MouadEnnaciri 为了将来的参考,请记住这不是改变数组,而是创建一个新数组。 (15认同)