js-数组删除指定元素的效率比较
2018-06-13 本文已影响0人
前端喵
本文分析几种从数组中删除指定元素(该元素出现可能不止一次)的方法的效率,这几种方法都不会改变原数组。话不多说直接上代码。
var array = [];
let count = 100;
for(let i=0; i<count;i++){
if(i%7===0){
array.push('test'+7);
}else {
array.push('test'+i);
}
}
var special = 'test7';
console.log('count:',count);
/*for i-- splice实现*/
console.log('for i ++');
var deleteArray = function (sourse, target) {
for(let i = sourse.length-1 ;i>=0 ; i--){
if (sourse[i]===target){
sourse.splice(i,1);
i++;
}
}
// console.log(sourse);
return sourse;
}
console.time('time1');
deleteArray(array,special);
console.timeEnd('time1');
/*数组转字符串实现*/
console.log('string');
var deleteArrayString = function (source, target) {
var myString = source.join(',') + ',';
let reg = `/${target},/g`;
let newstr = myString.replace(eval(reg),'');
var resultArray = newstr.split(',').slice(0,-1);
// console.log(resultArray);
return resultArray;
}
console.time('time2');
deleteArrayString(array,special);
console.timeEnd('time2');
/*filter 实现*/
console.log('filter');
console.time('time3');
/*console.log(array.filter(function (value) {
return value !== special;
}));*/
array.filter(function (value) {
return value !== special;
});
console.timeEnd('time3');
/*for 新数组实现*/
console.log('for new array');
var deleteArrayNew = function (sourse, target) {
var newArray = [];
for(let i in sourse){
if (sourse[i]!==target){
newArray.push(sourse[i]);
}
}
// console.log(newArray);
return newArray;
}
console.time('time4');
deleteArray(array,special);
console.timeEnd('time4');
改变数据量count,来观察这几种方法的执行效率。如下图

数据量较小时零点几毫秒的差距并不明显,当数据量增加时,代码运行的时间差也越来越大,其中用到splice的方法里面在数据量大增时效率明显低很多,我想原因大概是splice每执行一次都要移动很多次数组的元素,导致效率低下。