两个问题考虑以下对象:
//new obj
var obj = {};
obj['cars'] = [];
obj['cars']['toyota'] = 1;
obj['cars']['mazda'] = 0;
console.log(obj);
console.log(JSON.stringify(obj));
为什么我的汽车阵列长度为0?我是否必须手动更新长度属性?
为什么我的字符串化对象在其中包含参数时为空?我假设它与长度属性绑定?
答案 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
(获取键列表,因为它是一个数组,它有一个长度)。
但问题还在于您将汽车初始化为数组,但将其用作对象 ......
请参阅此处的文档:
解决方案是将其初始化为对象:
//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;