如何将对象中的按键推送到数组?
假设我有以下对象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); } }