【问题标题】:How do I push the keys from an object to an array?如何将键从对象推送到数组?
【发布时间】:2011-08-17 10:09:51
【问题描述】:

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

【问题讨论】:

  • 我已经发布了一个经过测试的正确解决方案
  • 不确定是否正确,但我最终使用了for(var k in obj){ allOfTheKeys.push(k); for (var i = 0; i < obj[k].length; i++){ if (allOfTheArrays.indexOf(obj[k][i]) == -1){ allOfTheArrays.push(obj[k][i]); } } }

标签: javascript jquery arrays object node.js


【解决方案1】:

正如我所见,其他答案返回重复值。这里有解决方案(tested):

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,这里有一个更容易理解的解决方案:

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

【讨论】:

  • 嘿,对不起,我对此有点陌生,我最终做了:for(var k in obj){ allOfTheKeys.push(k); for (var i = 0; i &lt; obj[k].length; i++){ if (allOfTheArrays.indexOf(obj[k][i]) == -1){ allOfTheArrays.push(obj[k][i]); } } } 你能快速概述一下你的这部分代码的作用吗:for(var i=0; i&lt; obj[key].length; i++) nonRepeatedElems[obj[key][i]] = true;for(var e in nonRepeatedElems ) allOfTheArrays.push(parseInt(e, 10));我猜这是一个比我更好的解决方案,但我并不完全理解它。谢谢!
  • 这真的非常复杂,你不觉得吗?
  • @Charlie,请提供一个更简单的可行的解决方案,我相信你。如果我的解决方案是正确的,你为什么要投反对票?
  • @float,我正在为解决方案添加解释。干杯
  • 为什么会被否决?这可能不是最好的解决方案,但肯定不是“无用”或“不正确”的解决方案。
【解决方案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);

【讨论】:

  • @Charlie 我最终使用的是基于您的解决方案。 for(var k in obj){allOfTheKeys.push(k);for (var i = 0; i &lt; obj[k].length; i++){if (allOfTheArrays.indexOf(obj[k][i]) == -1){allOfTheArrays.push(obj[k][i]);}}}我不确定我是否只是错误地执行了您的简写操作,但 allElem 正在返回:_atomics,validators,_path,_parent,_schema,_cast,_markModified,_registerAtomic,doAtomics,push,$push,nonAtomicPush,$pushAll,$pop,$shift,remove,$pull,pull,$pullAll,toObject,0,1,_atomics,validators,_path,_parent,_schema,_cast,_markModified,_registerAtomic,doAtomics,push,$push... etc
  • @Charlie,您的解决方案返回['1','2','3','1','2','9','1','3','5'],因为它不处理重复值,这就是我对您投反对票的原因。你为什么拒绝我?我的解决方案准确地返回了 float 要求的内容
  • @查理。让我们停止作为孩子的战斗嘿嘿嘿。干杯:)
  • @Edgar,您的解决方案使用三个循环代替两个循环,错过了使用 for..in 循环的机会,该循环更安全且通常更快,并且取决于构建标志数组来做什么你可以做在线。它过于复杂和缓慢。并注意到你一直在和自己争论——三个 cmets?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多