我有以下JS陣列/對象JSON陣列性能
var x = [1,2,3,4];
x.name = "myArray";
我使用json2.js,我試圖將字符串中的序列X。 和我所得到的是陣列: [1,2,3,4]
是否正確? 因爲我可以添加任何屬性到數組爲什麼不json2處理? 我錯過了什麼?
我有以下JS陣列/對象JSON陣列性能
var x = [1,2,3,4];
x.name = "myArray";
我使用json2.js,我試圖將字符串中的序列X。 和我所得到的是陣列: [1,2,3,4]
是否正確? 因爲我可以添加任何屬性到數組爲什麼不json2處理? 我錯過了什麼?
讓我們想象一下,我們出來的東西,如:
[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