2011-04-08 64 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