2014-07-25 5 views
3

Я немного потерял со следующим:JavaScript длина массива вопрос

Когда я делаю console.log двух различных массивов, один дает мне фактическую длину, но не другой.

Выход первого массива, с хорошей длиной:

[Object, Object, Object] 
    0: Object 
    1: Object 
    2: Object 
    length: 3 
    __proto__: Array[0] 

Вывод второй, длина должна быть 4, но на самом деле 0:

[A: Object, B: Object, C: Object, D: Object] 
    A: Object 
    B: Object 
    C: Object 
    D: Object 
    length: 0 
    __proto__: Array[0] 

Почему мой первый массив действительно есть правильная длина, но не вторая?

Edit: это код генерации выше вывод:

var links = [ 
    {source: "A", target: "B"}, 
    {source: "A", target: "C"}, 
    {source: "A", target: "D"} 
]; 

var nodes = []; 

// Compute the distinct nodes from the links. 
links.forEach(function(link) { 
    link.source = nodes[link.source] || (nodes[link.source] = {name: link.source}); 
    link.target = nodes[link.target] || (nodes[link.target] = {name: link.target}); 
}); 

console.log(links); 
console.log(nodes); 
+1

У вас есть образец кода, который воспроизводит это? –

+4

Второй объект - это объект, массив не может содержать символы как индексы, только объекты могут – adeneo

+1

Это может помочь: [Длина массива объектов JavaScript] (http://stackoverflow.com/questions/5223/length-of- javascript-object-ie-associative-array? rq = 1) – PattaFeuFeu

ответ

3

Второе сообщение журнала не может выводить длину массива, поскольку значения были присвоены своим свойствам, в отличие от его показателей , поскольку в фактических индексах объекта нет объектов length - 0. Это происходит потому, что массивы не могут содержать нечисловые индексы, такие как A, B, C, D.

Итак, когда вы выполняете:

var arr= []; 
arr["b"] = "test"; 

код фактически назначая строковый литерал тест на b свойство arr массива, в отличие от индекса. Это возможно, потому что массивы являются объектами в Javascript, поэтому они также могут иметь свойства.

+0

Эх, не совсем. 'Array' расширяет' Object', но все еще может иметь свойства. 'A',' B' и т. Д. Являются свойствами массива. '.push()' будет работать, например. – Mathletics

+0

@Mathletics Я считаю, что свойство, а не индексированный объект внутри массива. –

+0

Правильно, это именно то, что я сказал. Однако регистрируемый элемент по-прежнему является массивом, он просто не имеет никаких элементов. – Mathletics

1

Длина объекта Array - это просто его наивысший цифровой индекс плюс один. Второй объект не имеет числовых индексов, поэтому его длина равна 0.

Если бы это было [ A: Object, B: Object, C: Object, 15: Object ], то его длиной будет 16. Значения length не привязанные к числу фактических свойств (4 в данном случае).

Смежные вопросы