JSON阵列性能
我有以下JS阵列/对象JSON阵列性能
var x = [1,2,3,4];
x.name = "myArray";
我使用json2.js,我试图将字符串中的序列X。 和我所得到的是阵列: [1,2,3,4]
是否正确? 因为我可以添加任何属性到数组为什么不json2处理? 我错过了什么?
- 首先json2.js忽略数组中的属性。
- 如果它不想忽略它们,那么将不可能有一个json格式的数组,这应该很容易评估。
让我们想象一下,我们出来的东西,如:
[1,2,3,4]{name:'test',anotherProperty:'someValue'}
如果上面是有效的JavaScript来创建一个数组,并坚持两个属性那么这将是伟大的,我们可以JSON-它。 这将相当于做到这一点:
array = [1,2,3,4]
array.name = 'test';
array.anotherProperty = 'someValue';
但它不是,这就是为什么我们不能持续到JSON的原因。
你期待看到什么? :)我不确定你想要做什么。
x
是一个数组,当您做了x.name
时,您只需设置一个名为name
的属性作为数组对象。 name
属性本身不被添加到数组中。你可以在Firebug看到:
数组对象有一个名为name
属性,但该属性的值不添加到阵列本身。
你想要做的是这样的:
var x = {
array: [1, 2, 3, 4],
name: "myArray"
};
现在你有一个对象称为x
一个具有两个属性。 array
属性是指数组,而name
属性是指该名称。 x.array
会给你的阵列,而x.name
会给你的名字。
编辑
这是针对你的意见。虽然数组可以用属性丰富是真的,但想想当你必须序列化这个对象时它意味着什么。当你序列化x
时,你想看到什么?如果x
已经是数组[1, 2, 3, 4]
,那么您如何在JSON中表示它?你可以把它表示为:
{ 0: 1,
1: 2,
2: 3,
3: 4,
name: "myArray"
};
但是你现在拥有的不再是一个数组。此外,数组对象本身有一堆本机属性。 JSON序列化程序应该如何处理这些?
我想你正在将一个数组作为一个对象和一个数组混合成一个文字。数组作为文字只是[1, 2, 3, 4]
。现在在内部,作为对象的数组大概具有指向数组的实际值的一些属性。它还具有其他属性(如length
)和对其起作用的方法(如slice
)。
JSON串行器涉及对象的值。如果x
是一个数组,那么必须序列化的东西是x
的值,即[1, 2, 3, 4]
。 x
的属性完全不同。
如果您想要序列化这些附加属性,那么您将不得不编写自己的序列化程序,它将遍历数组的属性并表示地图/关联数组中的所有内容。这是唯一的方法;正如我之前提到的那样,警告是你不再有真正的数组。
儿童警告:这只是一个对象。对象字面量是您创建它的手段。 – 2011-04-08 16:32:55
@Tim将解决。对不起,我的条款混淆了! – 2011-04-08 16:34:55
数组可以丰富属性。在某些情况下,这是非常有益的。这里没有必要说明这种情况。假设他们不是常态。尽管如此,我意识到,丰富的阵列不是简单的,在我看来这是一种耻辱。 – chacko 2011-04-08 16:36:23
问题是json2仍然认为它是一个数组,因为x instanceof Array
返回true。为了解决这个问题,你可以以一种迂回的方式打造的“数组”:
var x = {
0: 1,
1: 2,
2: 3,
3: 4,
length: 4,
name: 'myArray'
};
这种解决方案的问题在于,没有一个阵列方法将可用的对象。所以如果你需要使用pop,push等,你必须将它转换成一个真正的数组,用Array.prototype.slice.call(x);
或者如果你是字节饿的[].slice.call(x);
。
不知道为什么你会做,但在循环将得到一切
var x = [1,2,3];
x.name = "wtf";
for(var y in x){
console.log(y + ":\t" + x[y]);
}
产地:
0: 1
1: 2
2: 3
name: wtf
但json2代码不会看到它,这样,为什么不你将它转换为一个对象?
因为丰富的数组传递给我,我需要坚持它。我想我可以在持久化和反序列化之前将其转换。 – chacko 2011-04-08 16:40:51
**你想要做什么**? – Neal 2011-04-08 16:28:08
您不能将任何属性添加到数组。数组是数值指数到数值的映射。从技术角度讲,在JavaScript中,你可以添加任何属性到一个'Array'对象,因为它们是建立在'Object'类型之上的,尽管你不应该这样做。你有什么打算? – 2011-04-08 16:28:50
为什么重载数组?只要做'var x = {}; x.array = [1,2,3,4]; x.name =“myArray”; '或者将其设置为JSON开始:'var x = {“name”:“myArray”,“array”:[1,2,3,4]}' – mplungjan 2011-04-08 16:29:09