在数组元素上使用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);
如果我可以像删除对象那样删除数组元素,为什么还要使用拼接方法?
当前回答
如果要删除的元素位于中间(例如,我们要删除索引为1的“c”),可以使用:
var arr = ['a','b','c'];
var indexToDelete = 1;
var newArray = arr.slice(0,indexToDelete).combine(arr.slice(indexToDelete+1, arr.length))
其他回答
表演
关于功能差异,已经有很多很好的答案了——所以这里我想关注性能。今天(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的行为类似于非真实情况,它只是删除项,但数组长度保持不变:
来自节点终端的示例:
> var arr = ["a","b","c","d"];
> delete arr[2]
true
> arr
[ 'a', 'b', , 'd', 'e' ]
这里有一个函数,使用slice()按索引删除数组中的项,它将arr作为第一个参数,将要删除的成员的索引作为第二个参数。如您所见,它实际上删除了数组的成员,并将数组长度减少1
function(arr,arrIndex){
return arr.slice(0,arrIndex).concat(arr.slice(arrIndex + 1));
}
上面的函数所做的是将索引之前的所有成员和索引之后的所有成员连接在一起,并返回结果。
下面是一个使用上述函数作为节点模块的示例,查看终端将非常有用:
> var arr = ["a","b","c","d"]
> arr
[ 'a', 'b', 'c', 'd' ]
> arr.length
4
> var arrayRemoveIndex = require("./lib/array_remove_index");
> var newArray = arrayRemoveIndex(arr,arr.indexOf('c'))
> newArray
[ 'a', 'b', 'd' ] // c ya later
> newArray.length
3
请注意,这不会在一个数组中使用重复数据,因为indexOf(“c”)只会得到第一次出现,并且只会拼接并删除它找到的第一个“c”。
拼接将使用数字索引。
而delete可以用于其他类型的索引。。
例子:
delete myArray['text1'];
应用delete运算符和splice()方法后,通过记录每个数组的长度可以看出差异。例如:
删除运算符
var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
delete trees[3];
console.log(trees); // ["redwood", "bay", "cedar", empty, "maple"]
console.log(trees.length); // 5
delete运算符从数组中删除元素,但元素的“占位符”仍然存在。橡树已经被移除,但它仍然占用阵列中的空间。因此,阵列的长度保持为5。
拼接()法
var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
trees.splice(3,1);
console.log(trees); // ["redwood", "bay", "cedar", "maple"]
console.log(trees.length); // 4
splice()方法完全删除目标值和“占位符”。橡树已经被移除,以及它在阵列中占据的空间。阵列的长度现在为4。
可能还值得一提的是,拼接仅适用于阵列。(不能依赖对象财产来遵循一致的顺序。)
要从对象中删除键值对,实际上需要删除:
delete myObj.propName; // , or:
delete myObj["propName"]; // Equivalent.