2011-09-23 165 views
2

我有成千上萬的遺留代碼將數組信息存儲在非數組中。JavaScript:將對象轉換爲對象數組

例如:

container.object1 = someobject; 
container.object2 = someotherobject; 
container.object3 = anotherone; 

我想擁有的是:

container.objects[1], container.objects[2], container.objects[3] etc. 

名稱的 '對象' 部分是恆定的。數字部分是它應該在數組中的位置。

我該怎麼做?

回答

6

假設object1,對象2,等等......是順序(如數組),那麼你可以遍歷容器對象並查找所有存在的順序objectN屬性,並將它們添加到數組中,並在丟失時停止循環。

container.objects = []; // init empty array 
var i = 1; 
while (container["object" + i]) { 
    container.objects.push(container["object" + i]); 
    i++; 
} 

如果你想第一項object1是在[1]點,而不是在陣列中較典型的[0]點,那麼你需要把一個空的對象放入數組的零槽下手,因爲你的榜樣沒有object0項目。

container.objects = [{}]; // init array with first item empty as an empty object 
var i = 1; 
while (container["object" + i]) { 
    container.objects.push(container["object" + i]); 
    i++; 
} 
+0

這實際上會略微偏離所描述的。 'object1'將是'objects [0]'而不是'[1]'。 –

+0

@kingjiv - 我已經解決了這個問題。如果他們打算使用一個數組,我認爲他們應該將它們的邏輯改變爲一個數組(使用從零開始的索引),但是它們可以有任何方式。 – jfriend00

1

這是相當容易:

var c = { objects: [] }; 

for (var o in container) { 
    var n = o.match(/^object(\d+)$/); 
    if (n) c.objects[n[1]] = container[o]; 
} 

現在c是你的新容器對象,其中c.object[1] == container.object1

2

另一種方法是使用keys

var unsorted = objectwithobjects; 
var keys = Object.keys(unsorted); 
var items = []; 
for (var j=0; j < keys.length; j++) { 
    items[j] = unsorted[keys[j]]; 
} 

您可以添加一個if語句來檢查,如果鍵包含「對象」,只有一個元素添加到在這種情況下你的條目(如果「objectwithobjects」包含其他按鍵你不想要的)。