2014-04-05 65 views
0

比方說,我有這樣的對象數組:從一個鍵值對對象的JavaScript中拔出鑰匙

[300: {a:"some", b:"value"}, 301: {a: "another", b: "val"} ...] 

我有一個類型的對象,我使用迭代遞歸函數,而且也沒有辦法,我會改變我的計數器在300,我總是從0開始。

我想到了一個解決方案,從agrray取出鑰匙,讓我有這樣一個數組:

[{a:"some", b:"value"}, {a: "another", b: "val"} ...] 

我如何在JavaScript中做到這一點?另外,如果有另一種方法比創建一個可以刪除密鑰的函數快得多,它會好很多。

+3

你知道你有什麼僅僅是一個數組,屬性'300','301'等,對嗎? – thefourtheye

+0

啊,是的,使用Array這個詞會更好,謝謝 –

+0

實際上你的期望輸出是一個對象數組,但是你的實際數組根本沒有元素。 – thefourtheye

回答

1

這會給你一個語法錯誤(語法錯誤:缺少]之後的元素列表):

var data = [300: {a:"some", b:"value"}, 301: {a: "another", b: "val"}]; 

你的意思是這樣的:

var data = {300: {a:"some", b:"value"}, 301: {a: "another", b: "val"}}; 

而將其轉換成一個數組,環比對象並將每個值推入新陣列:

var arr = []; 
for (var k in data) { 
    arr.push(data[k]); 
} 

Fiddle

+0

實際上,當我查看我的代碼的反覆對象時,是的,它不在'[]'中,它在'{}'中,不知道爲什麼我認爲它是在'[]' –

1

這裏有一點需要澄清。當你有一個數組從300開始作爲索引的對象時,這意味着你有300個索引,其值爲undefined,但如果它只是一個Array-like對象,它可能完全不同。

比方說,這不是一個數組類,是一個實際的Array,所以你必須把它過濾,使所有的undefined值也會從你數組中刪除,所以您的陣列應該是這樣的:

var arr = [/*0*/undefined, ..,/*299*/undefined, /*300*/{a:"some", b:"value"}, /*301*/ {a: "another", b: "val"} ...] 
var result = arr.filter(function(value,index){ 
    return (value !== undefined); 
}); 

但你在你的問題中提到,更可能一個JavaScript對象,所以,做你想做,你可以做什麼:

var myObj = {300: {a:"some", b:"value"}, 301: {a: "another", b: "val"} }; 
var result = {}; 
for(var key in obj){ 
    if(obj.hasOwnProperty(key)){ 
     result.push(obj[key]); 
    } 
} 
在此

for循環hasOwnProperty功能可以幫助你確保,如果它是一個實際對象價值es,而不是來自對象原型鏈的其他可能的鍵。

1

如果你的意思是說數組的初始結構是這樣的:

var data = [{300: {a:"some", b:"value"}}, {301: {a: "another", b: "val"}}]; 

那麼這應該工作(結果排列):

var result = []; 
var data = [{300: {a:"some", b:"value"}}, {301: {a: "another", b: "val"}}]; 
for(var i =0; i < data.length; i++){ 
    for(var key in data[i]) { 
     if(data[i].hasOwnProperty(key)) { 
      result.push(data[i][key]); 
      break; 
     } 
    } 
}