2011-03-17 69 views
5

在Javascript中我有我要處理只是項的JSON對象:如何在JavaScript中複製Python的dict.items()?

var json = { 
    itema: {stuff: 'stuff'}, 
    itemb: {stuff: 'stuff'}, 
    itemc: {stuff: 'stuff'}, 
    itemd: {stuff: 'stuff'} 
} 

在Python我能做

print json.items() 
[{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'},{stuff: 'stuff'}] 

我能做到這一點的JS?

+1

我應該補充說,_reason_我想這樣做,以便我可以對數組進行排序(鍵只是uid),所以也許我應該問「如何對關聯數組中的項進行排序」。 – 2011-03-17 12:05:57

+0

問題是不正確的。 Python的'dict.items()'返回(鍵值)元組列表。你的retval的例子對應於'dict.values()'。 – 2017-05-23 13:17:57

回答

3

如果不擴展Object.prototype(不想擴展Object.prototype),則無法以與python相同的方式執行此操作,因爲這是不幸的路徑。

你可以很容易地創建一個輔助功能,可以在對象上循環,把值到一個數組然而,像這樣:

function items(obj) { 
var i, arr = []; 
for(i in obj) { 
    arr.push(obj[i]); 
} 
return arr; 
} 

PS:JSON是一種數據格式,你有什麼是對象文字。

+0

關於對象字面的點,他們在js中如此緊密的聯繫,以至於你可以原諒我。 – 2011-03-17 12:11:39

1

在Python中dict.items返回包含鍵和dict的值的元組列表。 Javascript沒有元組,所以它必須是一個嵌套數組。

如果你會請我一個小小的python代碼來顯示不同之處。

>>> {1:2, 2:3}.items() 
[(1, 2), (2, 3)] 
>>> {1:2, 2:3}.values() 
[2, 3] 

我看到接受的答案返回對象值的陣列,其是蟒功能dict.values的等價物。所要求的是dict.items。要做到這一點,只需循環並建立一個2元素數組的嵌套數組。

function items(obj){ 

    var ret = []; 
    for(v in obj){ 
     ret.push(Object.freeze([v, obj[v]])); 
    } 
    return Object.freeze(ret); 
} 

我把Object.freeze在嚴格按照規範並執行返回的值不應改變,效仿蟒蛇元組的不變性。如果你把它拿出來,它顯然仍然有效。

需要指出的是,這樣做有點違背了items的目的,因爲它以線性而非關聯的方式迭代對象時使用,並且避免計算散列值以查找關聯數組中的每個元素。對於那些關心大型應用的小物體來說,這可能會讓你放慢速度,並且可能會有更習慣的方式來做你想要的JavaScript。

另一種更新的方法是使用Object.entries(),它將完全按照您的要求進行。

Object.entries({1:1, 2:2, 3:3}) 
     .forEach(function(v){ 
      console.log(v) 
     }); 

該支持僅限於文檔中提到的瀏覽器版本。

+0

你應該放棄'.hasOwnProperty()'調用。沒有優勢。 – Bergi 2017-03-01 02:41:20

+0

不,只是這在那裏毫無意義。有什麼好處?您想要枚舉的常用對象不會繼承可枚舉的屬性。如果你想爲那些擁有'.OnOwnProperty'屬性的人辯護,那麼你當然想要抵禦這些。 – Bergi 2017-03-01 02:44:28

+0

好的謝謝。我雖然會排除父類的任何屬性。儘管我是一個相對的noob,所以不知道那麼多。 – 2017-03-01 02:44:37