在数组元素上使用delete运算符与使用array.splice方法有什么区别?
例如:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
如果我可以像删除对象那样删除数组元素,为什么还要使用拼接方法?
在数组元素上使用delete运算符与使用array.splice方法有什么区别?
例如:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
如果我可以像删除对象那样删除数组元素,为什么还要使用拼接方法?
当前回答
IndexOf也接受引用类型。假设以下场景:
var arr=[{项:1},{项2},{项3}];var发现=发现(2,3)//伪代码:将返回〔{item:2},{item:3}〕var l=基础长度;而(l-){var索引=arr.indexOf(找到[l])arr.splice(索引,1);}控制台日志(arr.length)//1.
不同之处:
var item2 = findUnique(2); //will return {item: 2}
var l = arr.length;
var found = false;
while(!found && l--) {
found = arr[l] === item2;
}
console.log(l, arr[l]);// l is index, arr[l] is the item you look for
其他回答
表演
关于功能差异,已经有很多很好的答案了——所以这里我想关注性能。今天(2020.06.25),我对Chrome 83.0、Safari 13.1和Firefox 77.0进行了测试,以了解所提到的解决方案,以及所选答案
结论
拼接(B)解决方案适用于小型和大型阵列删除(A)解决方案对于大型阵列最快,对于小型阵列最快过滤器(E)解决方案在小阵列的Chrome和Firefox上速度最快(但在Safari上速度最慢,在大阵列上速度较慢)解决方案D很慢解决方案C不适用于Chrome和Safari中的大型阵列函数C(arr,idx){var rest=arr.slice(idx+1 | | arr.length);arr.length=idx<0?arr.length+idx:idx;arr.push.apply(arr,rest);返回arr;}//碰撞试验让arr=[…'abcdefghij'.repeat(100000)];//1M元件尝试{C(排列,1)}catch(e){console.error(e.message)}
细节
我对解决方案进行以下测试A.BCDE(我的)
对于小数组(4个元素)-您可以在这里运行测试对于大阵列(1M个元素)-您可以在这里运行测试
函数A(arr,idx){删除arr[idx];返回arr;}函数B(arr,idx){arr.splice(idx,1);返回arr;}函数C(arr,idx){var rest=arr.slice(idx+1 | | arr.length);arr.length=idx<0?arr.length+idx:idx;arr.push.apply(arr,rest);返回arr;}函数D(arr,idx){返回arr.slice(0,idx).contat(arr.slices(idx+1));}函数E(arr,idx){返回arr.filter((a,i)=>i!==idx);}myArray=[‘a’,‘b’,‘c’,‘d’];[A,B,C,D,E].map(f=>console.log(`${f.name}${JSON.stringify(f([…myArray],1))}`));此代码段仅显示使用过的解决方案
Chrome的示例结果
delete:delete将删除对象属性,但不会重新索引或更新其长度。这使它看起来像是未定义:拼接:实际删除元素,重新索引数组,并更改其长度。
从最后一个删除元素
arrName.pop();
从第一个删除元素
arrName.shift();
从中间删除
arrName.splice(starting index,number of element you wnt to delete);
Ex: arrName.splice(1,1);
从最后一个元素中删除一个元素
arrName.splice(-1);
使用数组索引号删除
delete arrName[1];
我有两种方法。
简单的一个:
arr = arr.splice(index,1)
第二个:
arr = arr.filter((v,i)=>i!==index)
第二种方法的优点是可以删除一个值(所有值,而不是像大多数情况一样只删除第一个实例)
arr = arr.filter((v,i)=>v!==value)
最简单的方法可能是
var myArray = ['a', 'b', 'c', 'd'];
delete myArray[1]; // ['a', undefined, 'c', 'd']. Then use lodash compact method to remove false, null, 0, "", undefined and NaN
myArray = _.compact(myArray); ['a', 'c', 'd'];
希望这有帮助。参考:https://lodash.com/docs#compact
删除Vs接头
从数组中删除项时
var arr=[1,2,3,4];删除arr[2]//结果[1,2,3:,4]控制台日志(arr)
当您拼接时
var arr=[1,2,3,4];arr.splice(1,1)//结果[1,3,4]控制台日志(arr);
如果删除,元素将被删除,但索引仍为空
而在拼接元件被删除的情况下,其余元件的索引相应地减少