javascript - JS Splice Array of Nulls 删除最后一个索引而不考虑参数
问题描述
由于特定于该应用程序的原因,数据或 s 数组null
用于显示表单列表。区别在于数据是由服务提供还是手动添加,其中null
表示所有内容都是通过按钮而不是服务手动添加的。
因此,忽略s数组的用例,null
事实证明,根据将值输入到基于数组长度显示的不同形式中,[null, null, null].splice(0, 1);
删除at 索引 2 而不是 0,然后查看谁在删除时消失。null
可以通过向{ index: theIndex }
数组添加一些独特的东西而不是null
. 所以 splice 现在可以正确地删除索引 0 而不是 2 处的项目,但现在我很好奇 splice 在幕后做了什么,它无法删除索引,无论它与其他索引相比的值如何。
谁能解释splice
在做什么?根据splice 的规范,我真的不明白为什么会发生这种情况。
解决方案
(这来自问题中的评论,但太大而不能成为评论)。
所以我认为你有一个概念上的误解(^^)。看看这个例子:
let a = [1, 2, 3]
a.splice(0, 1) // => 1
a // => [2, 3]
let b = [1, 2, 3]
delete b[0] // => true
b // => [<1 empty slot>, 2, 3]
该函数就地splice
修改数组。请注意,虽然我们拼接了第一个元素,但我们得到了一个包含两个元素的数组。
现在看这个例子
let a = [1, 1, 1]
a.splice(0, 1)
a // => [1, 1]
let b = [1, 1, 1]
b.splice(2, 1)
b // => [1, 1]
我们正在删除第一个元素 froma
和最后一个元素 from b
,但当然没有办法告诉我们只看结果。
在null
s 的情况下,同样的事情正在发生。一些库(Angular)试图找出你删除了哪个元素,但没有办法知道。这是因为null === null
.
现在,如果您使用空对象数组,例如,将有一种方式知道. 由于{} !== {}
--- 因为每次您投射 a 时,{}
您都在创建一个唯一的对象---,那么您就可以知道空对象数组中缺少哪个元素。情况与数组类似[1, 2, 3]
。
let a = [{}, {}, {}] // lets imagine that each object has a unique id
// and we have [{}#1, {}#2, {}#3]
let [obj1, obj2, obj3] = a
obj1 === obj2 // => false, because they have different ids.
a.splice(0, 1)
a // => [{}#2, {}#3]
a.includes(obj1) // => false, because {}#1 is no longer in a
因此,使用 s 数组的替代方法是null
使用空对象数组。我认为这就是为什么当你使用像{ index: theIndex }
. 但当然,这一切都取决于 Angular 的智能程度。我敢打赌,有一种更原生的删除元素的方式,正如@KaiserKatze 指出的那样,“如果数组映射到您的模型,直接删除或添加数组中的元素总是一个坏主意。”
你必须明白,当你拼接数组时,你只是在这样做——从数组中删除一个元素。拼接数组时不会删除“表单元素”。相反,一些外部代码正在读取数组并试图找出——在幕后——你打算做什么。
推荐阅读
- r - 向我的地图添加纬度/经度点不起作用(R STUDIO)
- javascript - 如何移动一系列posenet点?
- java - 在另一个文件中调用非静态方法导致找不到符号
- javascript - Expo sdk 升级到 41 时缺少节点模型
- python - 使用 boto3 创建 dynamodb 表时出错(“botocore.exceptions.ClientError”)
- html - 在 Django 中,如何添加无限数量的带有文本的图像?
- sql - 如何让我的结果按 MS Access 中的 SO 编号分组
- xcode - Appium Desktop 未捕获屏幕元素,只是不断加载
- python-3.x - 通过 API Gateway 进行测试时,使用 python 的 AWS lambda 出错
- python - 我如何在 guizero TextBox disable() 中使用?