Массив, содержащий объекты, имеет неправильную длину - PullRequest
1 голос
/ 04 января 2012

У меня есть массив вроде:

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

Это массив instanceof, но он возвращает только 1 для .length?

Соответствующий код:

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 голосов
/ 21 июня 2012

Проблема заключалась в том, что console.log веб-инспектора Chrome является асинхронным событием. Таким образом, длина была поиском свойства, поэтому она мгновенно возвращала его обратно, но объект с двумя предметами внутри удерживался до тех пор, пока не сработали остальные события.

В будущем я и другие люди, имеющие эту проблему, должны вместо этого использовать debugger;.

0 голосов
/ 04 января 2012

Возможно, ваш код выполняется в порядке, отличном от ожидаемого. т. е. когда вы регистрируете errors и errors.length, errors содержит только 1 объект. Но после этого вы добавляете в массив errors, и только после этого вы смотрите на консоль. В этот момент вы можете увидеть больший массив в errors по двум причинам - во-первых, ваш фактический код не регистрирует errors, а какой-то объект, который содержит errors. В этом случае дисплей консоли работает и покажет вам не то, что было в errors в то время, а то, что сейчас в нем. Кроме того, консоль может просто занять некоторое время для записи errors.

Без дополнительного кода я не могу быть уверен, что это так. Но вы можете проверить это, заменив console.log(errors); на console.log(errors[1]);. Если ошибки действительно только 1 длинны в то время, он будет регистрировать undefined.

0 голосов
/ 04 января 2012

это объект Array или что-то похожее на него?

массивы работают:

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

вам придется предоставить больше кода.

и теперь, когда вы предоставили соответствующий код, правильный ответ - , что сказал Стив Уэлленс (кстати, за него проголосовали).

Array.push добавляетодин элемент, объекты могут иметь более одного ключа, но они по-прежнему являются одним объектом, поэтому ваш реальный случай отличается от вашего исходного примера, что, конечно, работает.


другая возможность:

> a = []
[]
> a.length = 2
2
> a
[]
> a.length
2
> a instanceof Array
true
0 голосов
/ 04 января 2012

Правильно, этот код:

var errors = new Array();

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

... добавляет ОДИН объект в массив.Объект имеет два свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...