如何将对象中的按键推送到数组?

假设我有以下对象obj

 obj = { 'key1' : ['1','2','3'], 'key2' : ['1','2','9'], 'key3' : ['1','3','5'] } 

我怎样才能将obj转换成如下所示的两个数组?

 allOfTheKeys = ['key1','key2','key3'] allOfTheArrays = ['1','2','3','5','9'] 

就像是

 allKeys = []; allElems = []; for(var k in obj){ allKeys.push(k); for(var e in obj[k]){ allElem.push(e) } } 

其实,在jQuery中,你可以使用each()来更简洁地做到这一点(警告,这是未经testing的代码):

 jQuery.each(obj,function(key){ allKeys.push(key); jQuery.each(obj[key],function(elem){ allElems.push(elem); } }); 

好吧,你不想重复,join

 if(!(elem in allElems)) allElems.push(elem); 

正如我所看到的,其他答案会返回重复的值。 在这里你有解决scheme( testing ):

 var allOfTheKeys = [], allOfTheArrays = [], nonRepeatedElems = {}; for(var key in obj){ allOfTheKeys.push(key); for(var i=0; i< obj[key].length; i++) nonRepeatedElems[obj[key][i]] = true; } for(var e in nonRepeatedElems ) allOfTheArrays.push(e); 

如果有人想知道nonRepeatedElems是什么,它是一个数组值的散列表,其中的关键是数组元素值。 所以我没有得到重复的元素。

如果你想要你的值被定购,只需调用allOfTheArrays.sort(); 到底。

编辑 :@float,在这里你有一个更容易理解的解决scheme:

 var allOfTheKeys = [], allOfTheArrays = []; for(var key in obj){ allOfTheKeys.push(key); for(var i=0; i< obj[key].length; i++){ var arrayElem = obj[key][i]; if(!$.inArray(arrayElem, allOfTheArrays)) //Add to the array if it doesn't exist yet allOfTheArrays.push(arrayElem); } }