包含对象的数组长度错误

时间:2012-01-03 22:47:10

标签: javascript arrays object loops

我有一个像:

这样的数组

errors = [ {...}, {...}, {...} ]

这是一个instanceof数组,但它只为.length返回1?

相关代码:

if(data.error){
  errors.push({'element':ele,error:data.error});
}

//Above is looped a few times and there are N number of errors now inside

console.log(errors) //Returns 2+ objects like {...}, {...}
console.log(errors.length) //Returns 1

对于Uzi和Muirbot,这里是错误数组:

[
Object
element: b.fn.b.init[1]
error: "You must enter "example" into the field to pass"
__proto__: Object
, 
Object
element: b.fn.b.init[1]
error: "Crap!"
__proto__: Object

4 个答案:

答案 0 :(得分:0)

这是正确的,这段代码:

var errors = new Array();

errors.push({'element':'ele', error:'data.error'});

...将一个对象添加到数组中。该对象有两个属性。

答案 1 :(得分:0)

您的代码可能按照您期望的顺序执行。即,当您同时记录errorserrors.length时,errors只包含一个对象。但之后你要添加到errors数组,只有在那之后才能看到控制台。此时,您可以在errors中看到更大的数组,原因有二:首先,您的实际代码不会记录errors,而是包含errors的某个对象。在这种情况下,控制台显示是实时的,并且不会显示当时errors中的内容,而是现在的内容。或者,控制台可能只需要一些时间来记录errors

如果没有更多代码,我无法确定是否是这种情况。但您可以将console.log(errors);替换为console.log(errors[1]);来验证它。如果当时错误实际上只有1个,则会记录undefined

答案 2 :(得分:0)

问题在于Chrome的Web Inspector的console.log是一个异步事件。因此,长度是一个属性查找,所以它立即返回,但内部有两个项目的对象被推迟,直到其余的事件被触发。

将来我和其他有此问题的人应该使用debugger;代替。

答案 3 :(得分:-1)

  

是一个Array对象还是类似于它的东西?

     

数组有效:

> a = [{a:1}, {b:2}]
[Object, Object]
> a.length
2
     

你必须提供更多代码。

现在你已经提供了相关的代码,正确的答案是what Steve Wellens said(顺便说一句,这个答案是低估的。)

Array.push添加了一个元素,对象可能有多个键,但它们仍然是一个对象,因此您的实际案例与原始示例不同,这当然有效。


另一种可能性:

> a = []
[]
> a.length = 2
2
> a
[]
> a.length
2
> a instanceof Array
true