数组/列表长度为零但数组不为空

8

当我使用console.log输出我的数组时,它显示长度为零。我检查了一下它是一个数组,使用了Array.isArray ,返回值为true。我还打印了数组的值以确保它们存在,并在控制台中显示:

[]
0: "a"
1: "b"
2: "c"
3: "d"
length: 4
__proto__: Array(0)

我看到 __proto__: Array(0),我认为这意味着它是一个长度为 0 的数组,但如何使它成为非零长度,以便我可以遍历它?

我想到的一个想法是这个函数可能是异步的,但我不太确定如何解决这个问题。

参考代码:

var list=[]
//getting data from a database
snapshot.forEach(function (node) {
   list.push(node.val())
   console.log(node.val()) //values print out
})
console.log(list) //array is length zero

我基本上想在这段代码后添加一个for循环,以便读取每个值并用于其他事情。但是,我无法遍历这个数组,因为它被注册为空。

我所使用的唯一函数是.push,用于将元素添加到数组中。这可能是问题的原因吗?否则我不知道其他添加元素到数组的方法。 - 374
你能否展示更多的代码?这会有所帮助。 - simbathesailor
你在推入异步代码吗?控制台保持对数组的实时引用,所以当你首次记录它时,你会看到初始值,但当你展开它时,你会看到异步所做的更改。 - Barmar
3
__proto__ 中显示的长度是原型对象的长度,而不是 this 对象的长度。 - Barmar
1
length: 4 显示了该数组的长度。 - Barmar
显示剩余2条评论
6个回答

11

对于其他遇到类似问题的人:

你很可能在异步函数中填充数组。

function asyncFunction(list){
 setTimeout(function(){
    list.push('a');
    list.push('b');
    list.push('c');
    console.log(list.length); // array length is 3 - after two seconds
 }, 2000); // 2 seconds timeout
}

var list=[];
//getting data from a database
asyncFunction(list);
console.log(list.length) //array is length zero - after immediately
console.log(list) // console will show all values if you expand "[]" after two seconds

这非常有帮助。我怀疑在大多数情况下这是正确的答案。 - David Bernat
@DavidBernat 实际上除了这个答案之外,每一个答案都是误导性和不正确的:https://dev59.com/kKjja4cB1Zd3GeqP4AGw#48120835 如果 OP 没有惊慌失措并尝试迭代数组(这是他的目标),那么 proto 就是 Object.prototype 的属性,正如 OP 的帖子所显示的那样 length: 4 - Aleksandar

1

__proto__不是你的对象,它是原型的访问器。

Object.prototype__proto__ 属性是一个访问器属性(包含一个 getter 函数和一个 setter 函数),通过该属性可以访问其所在对象的内部 [[Prototype]](一个对象或 null)。

使用 __proto__ 是有争议的,并已被不推荐使用。


1

我曾经遇到过同样的问题,在记录下如下所示的变量快照时,变量是在大部分逻辑执行后记录的,因为它稍后才可用,这就是为什么数组值不可访问的原因。

let admins = []
adminRef.once('value',(snapshot)=>{
   console.log(snapshot);
   snapshot.forEach(data=>{
   admins.push(data.key); 
 })
 })

所以将其更改为仅在快照变量可用时执行底层逻辑。
 adminRef.once('value',(snapshot)=>{
        if(snapshot){
            console.log(snapshot);
            snapshot.forEach(data=>{
            admins.push(data.key); 
        })}

0
我需要看更多你的代码,但这是你想要的东西。
var arr = [1, 3, 5, 6];
console.log(arr.length);
for (var i = 0; i < arr.length; i++){
  console.log(arr[i]);
}

我通常会从以下代码开始:var list = []然后使用for循环将值推入其中:list.push(value)在for循环之后,我会使用console.log(list.length) - 374
你的for循环是什么样子的? - Dylan Wright
我的回答应该会帮到你。我还没有看过你的for循环,但那看起来就是你的问题。 - Dylan Wright

0
今天我遇到了这个问题,如果你使用的是Vue2或Vue3,可能字段不会响应,你可以使用Vue.set(target, key, value)this.$set(target, key, value)来解决这个问题!

你的回答可以通过解释为什么这个解决方案有效,并包含相关文档链接来改进。 - Harrison

0

类似的问题,但不是解决方案。

            printVertices(){ 
                console.log(Array.isArray(this.vertices), this.vertices)
                let head = "<head> "  
                            this.vertices = [] 
 
                console.log(this.vertices)
                this.vertices.map(data => head += data.data + " ") 
                head += "<tail>" 
                console.log(head)
            }

            } 

           

正如您从我的终端顶部看到的那样!它显示Array.isarray(myarray)为true,而console.log(this.vertices)是LinkedList,然后在底部打印一个空数组。但是,this.vertices将LinkedList打印到控制台{{link1:enter image description here}}。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接