2016-04-14 2 views
0

Две задачи рассмотреть следующий объект:Длина свойство не обновляется на массивах объектов

//new obj 

var obj = {}; 
obj['cars'] = []; 
obj['cars']['toyota'] = 1; 
obj['cars']['mazda'] = 0; 


console.log(obj); 
console.log(JSON.stringify(obj)); 
  1. Почему мои авто массива имеет длину 0? Нужно ли вручную обновлять свойство длины?

  2. Почему мой строковый объект пуст, когда в нем есть параметры. Предполагаю, что он связан с свойством length?

Fiddle: https://jsfiddle.net/wcd7f8Lz/

+1

Измените 'cars' на объект. https://jsfiddle.net/u3tsu4gg/. Массивы имеют только индексирование на основе целых чисел, а не строки, как в вашем примере. Вы можете получить длину 'cars' с помощью' Object.keys (obj.cars) '.length; – Andy

+0

@andy это работает, но почему это не работает правильно с массивом? – Edward

+1

'obj.cars.push ('toyota'); obj.cars.push ('мазда'); obj.cars.length; // => 2' –

ответ

1

автомобиль инициализируется как массив, но используется как объект. и объект не имеет атрибута длины ...

Чтобы получить длину объекта, вы можете сделать Object.keys(obj).length (получить список ключей, а так как это массив, он имеет длину).

Но проблема в том, что также инициализации автомобилей в качестве массива, но и использовать его в качестве объекта ...

см документы здесь:

http://www.w3schools.com/js/js_arrays.asp

http://www.w3schools.com/js/js_objects.asp

Решение инициализировать его как Object:

//new obj 

var obj = {}; 
obj['cars'] = {}; //And other object 
obj['cars']['toyota'] = 1; 
obj['cars']['mazda'] = 0; 


console.log(obj); 
console.log(JSON.stringify(obj)); 

Но если вы хотите вместо простого массива:

//new obj 
var obj = {}; 
obj['cars'] = []; 
obj['cars'][1] = "toyota"; 
obj['cars'][0] = "mazda"; 


console.log(obj); 
console.log(JSON.stringify(obj)); 

Синтаксис является array[identifier] = value; (а не array[value] = identifier)

Я обновил скрипку.

+0

_ «автомобиль - это не массив, это объект», вероятно, требуется переписать, потому что 'cars' _is_ массив, но не может быть назначен строковыми индексами, - что является основой вопроса. – Andy

+0

Я вижу в javascript «массивы» должен использовать числовой индекс. – Edward

+1

@ Andy Я отредактировал мой пост! Спасибо, что посмотрели мои сообщения;) – Vincent

0

Почему вы не используете его таким образом?

var cars = []; 
cars.push({name:'toyota', value:1}); 
cars.push({name:'mazda', value:0}) 
2

obj.cars.length является 0, потому что вы не выдвигайте новые элементы в массиве, но изменить Это свойства:

var obj = {}; 
obj.cars = [];   // obj.cars is empty array 
obj.cars.toyota = 1; // obj.cars is empty array with a new property toyota 
obj.cars.push('mazda'); // obj.cars is array with a new property toyota and one element mazda 

console.log(obj.cars instanceof Array, 
      obj.cars.length, 
      Object.keys(obj.cars)); // output: true 1 ["toyota"] 
0

Это потому, что вы не используете массив (несмотря на декларирование это с литералом массива), вы используете его как объект.

Массивы - это особый случай объекта, то есть они могут иметь индивидуальные свойства. Эти свойства не существуют в «массиве», а вместо этого являются свойствами «массива».

var arr = [1, 2, 3]; 
arr.thing = 'a'; 
console.log(arr.length); // 3 

Чтобы добавить элементы в массив, вы должны использовать push:

var arr = []; // length: 0 
arr.push(1); // length: 1 

Если вы хотите, чтобы иметь возможность получить доступ к объекту как по имени и индекса, то вы можете комбинировать push с пользовательским свойства.

var arr = []; 
arr.push(0); 
arr.mazda = 0; 
Смежные вопросы