我希望通过保留原始数组而不创建新数组来筛选数组。
使用 Array.filter()
方法:
getFiltersConfig() {
return this.config.filter((topLevelConfig) => topLevelConfig.name !== 'origin')
}
什么是在不返回新数组的情况下按值筛选以获得相同结果的最佳方法?
我希望通过保留原始数组而不创建新数组来筛选数组。
使用 Array.filter()
方法:
getFiltersConfig() {
return this.config.filter((topLevelConfig) => topLevelConfig.name !== 'origin')
}
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);
ref
和arr
都只会包含1个值,这就是副作用突变的结果,也是常常导致混淆的原因,通常建议避免使用。 - Keithvar temp = this.config.filter((topLevelConfig) => topLevelConfig.name !== 'origin')
this.config.length = 0; //clears the array
this.config.push.apply(this.config, temp); //adds what you want to the array of the same reference
if(!Array.prototype.filterThis){
Array.prototype.filterThis = function (callBack){
if(typeof callBack !== 'function')
throw new TypeError('Argument must of type <function>');
let t = [...this];
this.length = 0;
for(let e of t) if(callBack(e)) this.push(e);
return this;
}
}
let a = [1,2,3,4,5,5,1,5];
a.filterThis(x=>x!=5);
console.log(a);
filterThis
方法 :) 这种情况以前也发生过,显然 MooTools 在原型中添加了一个 contains 方法,并且实际上与 ES6 的 contains 冲突,引起了无尽的麻烦。 - KeithfilterThis
是否已经存在,并在下面添加一个警告文本,以及你的评论。虽然我不会删除答案,但这将在下次尝试更改内置原型时提醒我。 :D - A Rogue Otaku不确定为什么您想要进行变异,但如果您真的想这样做,也许可以将其分配回自身?
let arr = ['a','b','a'];
arr = arr.filter(x => x !== 'a');
console.log(arr)
Array.splice()
一样。 - Mouad Ennaciri