2011-04-08 150 views
6

我有以下JS阵列/对象JSON阵列性能

var x = [1,2,3,4]; 
x.name = "myArray"; 

我使用json2.js,我试图将字符串中的序列X。 和我所得到的是阵列: [1,2,3,4]

是否正确? 因为我可以添加任何属性到数组为什么不json2处理? 我错过了什么?

+1

**你想要做什么**? – Neal 2011-04-08 16:28:08

+0

您不能将任何属性添加到数组。数组是数值指数到数值的映射。从技术角度讲,在JavaScript中,你可以添加任何属性到一个'Array'对象,因为它们是建立在'Object'类型之上的,尽管你不应该这样做。你有什么打算? – 2011-04-08 16:28:50

+2

为什么重载数组?只要做'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

回答

2
  1. 首先json2.js忽略数组中的属性。
  2. 如果它不想忽略它们,那么将不可能有一个json格式的数组,这应该很容易评估。

让我们想象一下,我们出来的东西,如:

[1,2,3,4]{name:'test',anotherProperty:'someValue'} 

如果上面是有效的JavaScript来创建一个数组,并坚持两个属性那么这将是伟大的,我们可以JSON-它。 这将相当于做到这一点:

array = [1,2,3,4] 
array.name = 'test'; 
array.anotherProperty = 'someValue'; 

但它不是,这就是为什么我们不能持续到JSON的原因。

2

你期待看到什么? :)我不确定你想要做什么。

x是一个数组,当您做了x.name时,您只需设置一个名为name的属性作为数组对象。 name属性本身不被添加到数组中。你可以在Firebug看到:

enter image description here

数组对象有一个名为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的属性完全不同。

如果您想要序列化这些附加属性,那么您将不得不编写自己的序列化程序,它将遍历数组的属性并表示地图/关联数组中的所有内容。这是唯一的方法;正如我之前提到的那样,警告是你不再有真正的数组。

+0

儿童警告:这只是一个对象。对象字面量是您创建它的手段。 – 2011-04-08 16:32:55

+0

@Tim将解决。对不起,我的条款混淆了! – 2011-04-08 16:34:55

+1

数组可以丰富属性。在某些情况下,这是非常有益的。这里没有必要说明这种情况。假设他们不是常态。尽管如此,我意识到,丰富的阵列不是简单的,在我看来这是一种耻辱。 – chacko 2011-04-08 16:36:23

0

问题是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);

0

不知道为什么你会做,但在循环将得到一切

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代码不会看到它,这样,为什么不你将它转换为一个对象?

+0

因为丰富的数组传递给我,我需要坚持它。我想我可以在持久化和反序列化之前将其转换。 – chacko 2011-04-08 16:40:51