首页 > 解决方案 > 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 的规范,我真的不明白为什么会发生这种情况。

标签: javascript

解决方案


(这来自问题中的评论,但太大而不能成为评论)。

所以我认为你有一个概念上的误解(^^)。看看这个例子:

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,但当然没有办法告诉我们只看结果。

nulls 的情况下,同样的事情正在发生。一些库(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 指出的那样,“如果数组映射到您的模型,直接删除或添加数组中的元素总是一个坏主意。”

你必须明白,当你拼接数组时,你只是在这样做——从数组中删除一个元素。拼接数组时不会删除“表单元素”。相反,一些外部代码正在读取数组并试图找出——在幕后——你打算做什么。


推荐阅读