Javascript 数组为第一个结果返回“空”[重复]

问题描述 投票:0回答:3

使用 javascript,我有一个

measurements
变量。它是一个由 4 个对象组成的数组,每个对象都包含一个“id”键。

let measurements = [
    {
        'id': 1,
        ...
    },
    {
        'id': 2,
        ...
    },
    {
        'id': 3,
        ...
    },
    {
        'id': 4,
        ...
    },
]

我想创建一个带有 ID 的新数组作为键,但我有一个奇怪的结果:

测试1:

let list = []

for (let i = 0; i < measurements.length; i++) {
    list[i] = ''
}

console.log(list) // Ok, I have 4 entries ["", "", "", ""]

测试2:

let list = []

for (let i = 0; i < measurements.length; i++) {
    list[measurements[i].id] = ''
}

console.log(list) // I have 5 entries  [empty, "", "", "", ""], why ?
javascript
3个回答
1
投票

根据规范,数组实例上的特殊

.length
自己的属性将始终返回比数组的最大整数索引大一的整数。

在下文中,为索引

2
设置一个值将确保
.length
属性为数组
3
返回
arr
,并且该数组因此成为由两个空槽组成的稀疏数组,后跟值
foo
位于索引
2

const arr = []
arr[2] = 'foo'
console.log(arr.length) // 3
console.log(arr) // [empty, empty, 'foo']

在这种情况下,其他索引实际上不存在。这是因为 JavaScript 被设计为支持“稀疏数组”(即具有不连续索引的数组)。 JavaScript 引擎有时将数组中缺失的索引表示为 empty。请注意,一些基于 Web 的 JavaScript 编辑器(例如 StackOverflow 使用的编辑器)会将这些位置渲染为包含

undefined
(这是不正确的,并且可能是转译过程的限制)。

const arr = [] arr[2] = 'foo' console.log(arr.length) // 3 console.log(arr) // [undefined, undefined, 'foo'] !

请记住,在 JavaScript 中,数组“只是对象”,对于索引位置应用了约定(它们是具有与正整数对应的字符串名称的属性,例如

'2'

)。一旦理解了这一点,稀疏数组如何“正常工作”就变得清晰起来。数组中的“洞”是由这些属性名称表示的连续从零开始的整数序列中存在间隙的位置。

例如。

Array.from({ '1': 'foo', '3': 'bar', length: 4 }) // [empty, 'foo', empty, 'bar']



0
投票

让列表=[]

对于(令 i = 0;i

console.log(list) // 我有 5 个条目 [空、""、""、""、""],为什么?< measurements.length; i++) { list[measurements[i].id] = '' }

每次运行循环都会将一个项目添加到列表数组中的特定索引。

所以你从:[]开始 然后将一个项目添加到数组的位置 1:[empty, ""]。仅当位置 0 存在时,位置 1 才能存在。但是你没有在位置0添加任何东西,所以它是空的。

回答您的后续问题:如果您需要数组通过 id 查找内容,您可以在 Javascript 中使用对象:

{1:“”,2:“”,...}

如果项目的顺序很重要,您仍然可以使用数组并接受其中可能存在间隙。


-1
投票

要么执行

id-1

来解决此问题:

let list = []

for (let i = 0; i < measurements.length; i++) {
    list[measurements[i].id-1] = ''
}

console.log(list)

或者更改数组本身:

let measurements = [ { 'id': 0, }, { 'id': 1, }, { 'id': 2, }, { 'id': 3, }, ]

	
© www.soinside.com 2019 - 2024. All rights reserved.