如何将键从对象推送到数组?

时间:2011-05-03 04:22:18

标签: javascript jquery arrays object node.js

假设我有以下对象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']

2 个答案:

答案 0 :(得分:2)

这样的东西
allKeys = [];
allElems = [];

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

实际上,在jQuery中你可以使用each()更简洁地做到这一点(警告,这不是经过测试的代码):

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

好的,你不想重复,加入

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

答案 1 :(得分:1)

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

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();

编辑:@ fllo,这里有一个更容易理解的解决方案:

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);
   }
}