假设我有以下对象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']
答案 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);
}
}