长度属性未在对象数组上更新

时间:2016-04-14 18:58:30

标签: javascript

两个问题考虑以下对象:

//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. 为什么我的字符串化对象在其中包含参数时为空?我假设它与长度属性绑定?

  3. 小提琴:https://jsfiddle.net/wcd7f8Lz/

4 个答案:

答案 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"] 

答案 1 :(得分:1)

car初始化为数组,但用作Object。并且对象没有长度属性...

要获取对象的长度,可以执行Object.keys(obj).length(获取键列表,因为它是一个数组,它有一个长度)。

但问题还在于您将汽车初始化为数组,但将其用作对象 ......

请参阅此处的文档:

  

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

     

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

解决方案是将其初始化为对象

//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

我已经更新了小提琴。

答案 2 :(得分:0)

为什么你不以这种方式使用它?

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

答案 3 :(得分: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;
相关问题