我想通过保持相同数组而不创建新的数组来过滤一个数组。
使用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);
我想通过保留相同的数组而不创建新的数组来过滤数组。
通过在不返回新数组的情况下通过值过滤来获得相同结果的最佳方法是什么?
我有第二个标准的答案,但违反了第一个标准。我怀疑您可能需要"不创建一个新的"。特别是因为您只想保留对数组的引用,而不是因为您不想创建一个新的数组(例如,对于内存关注(。
您可以做的是创建您想要的温度阵列
var temp = this.config.filter((topLevelConfig) => topLevelConfig.name !== 'origin')
然后将原始数组的长度设置为0,然后push.apply((值;
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);
警告:在更改原型内置时要非常谨慎。我什至会说,除非您制作多填充不会碰到。可能导致的错误可能非常微妙,很难调试。
不确定为什么要进行突变,但是如果您真的想这样做,也许可以将其分配给自身?
let arr = ['a','b','a'];
arr = arr.filter(x => x !== 'a');
console.log(arr)