js数组删除元素的方法

你好!你问的是JS数组删除方法。
让我向你解释一下。
我最近遇到了很多问题...
上周,一位客户问我为什么使用 delete 删除数组元素会留下未定义的占位符。
这真的很烦人。
例如:
javascript 让 arr = [1 , 2 , 3 ]; 删除arr[1 ]; 控制台.log(arr); // 输出 [1 , 未定义, 3 ] console.log(arr.length); // 还是 3 ,长度不变
你看到了吗? delete只是将索引1 处的元素更改为undefined,但数组长度仍然是3 这会导致后续遍历跳过undefine,或者如果使用pop(),最后一个undefine会被杀死。
你肯定不希望这种偷偷摸摸的操作吧?
我自己遇到的坑是有一次写代码想用delete批量清理无效数据。
结果发现数组后面有一堆未定义的数据,数据不对齐并崩溃。
最后,使用 splice() 或者直接剪切数组会更安全。

对于splice(),我认为它非常灵活,但是使用时要小心。
例如:
javascript 让 arr = [1 , 2 , 3 , 4 , 5 ]; arr.splice(1 , 2 ); // 从索引1 开始删除2 ,变成[1 , 4 , 5 ]
如果startIndex或deleteCount出错,数组就会改变,这就需要反复调试。
最尴尬的是,当使用forEach结合拼接遍历时,如果你认为是同步删除,结果就整齐了:
javascript 让 arr = [1 , 2 , 3 , 4 , 5 ]; arr.forEach((项目, 索引, arr) => { 如果(项目> 3 ){ arr.splice(索引, 1 ); //删除大于3 的元素 } }); // 结果可能是 [1 , 2 , 3 , 4 ] 甚至更奇怪,因为索引已移动
我通常这样使用 splice:要么直接传递参数 splice(index, 1 ) 要么只是从后到前遍历:
javascript for (让 i = arr.length
1 ; i >= 0; i--) { 如果 (arr[i] > 3 ) { arr.splice(i, 1 ); }
这不会影响之前的索引。

filter() 是我更喜欢保留原始数组的场景,特别是当您想使用函数式编程风格时:
javascript 让 arr = [1 , 2 , 3 , 4 , 5 ]; let newArr = arr.filter(item => item <= 3 ); // 获取 [1 , 2 , 3 ] 到达; // 仍然是 [1 , 2 , 3 , 4 , 5 ],不变
只要你写好回调函数并正确设置过滤条件,新数组就会出现,而原始数组会像平常一样干净。
这个合适的要求就是“为我过滤所有满足这个条件的元素”。

最后我们来谈谈长度属性。
这个方法相当暴力,直接杀死所有后续元素:
javascript 让 arr = [1 , 2 , 3 , 4 , 5 ]; arr.长度 = 3 ; // 变为 [1 , 2 , 3 ]
如果你把它设置得太小,比如 arr.length = 1 ,那么其他的一切都会丢失。
这种方法速度快,但如果使用不当,可能会删除错误的数据。
例如,如果只想删除末尾的一些元素,直接设置长度也可以删除重要的元素。

总结一下我的建议:

删除开头和结尾:pop()或shift(),简单直接。

删除中间指定位置:splice(),这个最可控。

保留原数组,条件删除:filter(),优雅。

不要使用delete,留下undefine太麻烦。

按长度截断数组时要小心,以确保不会意外丢失数据。

无论如何,这取决于你。
每种方法都有它的位置。
关键取决于您的场景需要的功能。
我还在思考一个问题,删除拼接和过滤器哪个更高效……你可以自己测试一下。

js怎么删除数组中的某个元素

直接说结论吧:
splice():删除索引;改变原数组;并返回已删除的。
pop():删除最后一个;更新原数组并返回删除的值。
shift():删除第一个;改变原数组;返回删除的值。
filter():过滤器回调;返回一个新数组,不改变原数组。

根据需要选择:
替换原来的阵列?拼接、弹出 使用 Shift。
保存默认主题?使用过滤器和扩展运算符。
按值删除?使用过滤器或indexOf+splice。

示例:
组合: arr = [1 ,2 ,3 ]; arr.splice(1 ,1 ); 控制台.log(arr); // [1 ,3 ]
过滤器: arr = [1 ,2 ,3 ,2 ]; newArr = arr.filter(x => x !== 2 ); console.log(newArr); // [1 ,3 ]
就是这样。