使用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 ?
答案 0 :(得分:1)
根据the specification,数组实例上特殊的.length
自己的属性将始终返回一个比数组的最大整数索引大的整数。
在下面,为索引2
设置值将确保.length
属性为数组3
返回arr
,因此该数组将成为稀疏数组两个空插槽组成的数组,后跟索引foo
处的值2
。
const arr = []
arr[2] = 'foo'
console.log(arr.length) // 3
console.log(arr) // [empty, empty, 'foo']
在这种情况下,其他索引实际上不存在。这是因为JavaScript旨在支持sparse arrays(即具有不连续索引的数组)。 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']
答案 1 :(得分:0)
数组项从0开始计数。在循环中,您要为每个id添加元素。
让列表= []
for(令i = 0; i <测量长度; i ++){ list [measurements [i] .id] =''}
console.log(list)//我有5个条目[empty,“”,“”,“”,“”],为什么?
每次循环都将一个项目添加到列表数组中的特定索引。
因此,您以:[]开始 然后,将一个项目添加到数组中的位置1:[空,“”]。如果位置0存在,则只能存在位置1。但是您没有在位置0添加任何内容,因此为空。
要回答您的后续问题:如果您需要数组来通过id查找内容,则可以使用Javascript中的对象:
{1:“”,2:“”,...}
如果项目的顺序很重要,您仍然可以使用数组并接受其中可能存在间隙的情况。
答案 2 :(得分:-1)
数组项从0开始计数。在循环中,您要为每个id添加元素。但是您从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,
},
]