基于对象创建数组

时间:2016-05-27 22:41:02

标签: javascript arrays node.js

我有一个值为整数的对象。就像是: {cat:2,dog:1,bird:4}

我想创建一个数组,其中对象中的键与数值包含的次数相同。所以,在这个例子中: [" cat"," cat"," dog"," bird"," bird","鸟",鸟"]

键始终相同,但值可能为零。

我可以看到一种方法可以做到 - 对于每个键,我可以检索该值,然后将该单词推送到该数组的次数。但是,对于我的每个键,这需要几行代码(其中的代码明显多于此示例中的代码)。我曾尝试寻找更清洁的解决方案,但没有运气。有什么建议吗?

6 个答案:

答案 0 :(得分:2)

演示:https://jsfiddle.net/81LxL1qt/1/

var obj = {cat: 2, dog: 1, bird: 4};

var results = [];

for (var key in obj)
  for (var i = 0, count = obj[key]; i < count; i++)
    results.push(key);

console.log(results);

答案 1 :(得分:2)

这样做的一个非常实用的方法是:

&#13;
&#13;
var obj = {cat: 2, dog: 1, bird: 4};
var arr = [].concat(...Object.keys(obj).map(key => Array(obj[key]).fill(key)));
console.log(arr);
&#13;
&#13;
&#13;

它的作用基本上是对象的gets the keys,然后是maps每个键到具有该键的数组filled。然后使用flattens将生成的2D数组.concat()转换为1D数组。

补充阅读:Arrow functions=>),Spread operator...

答案 2 :(得分:1)

使用立即执行的生成器表达式

var obj = {cat: 2, dog: 1, bird: 4};
var output = [...function*() {
  for(var key of Object.keys(obj))
    for(var i=0; i<obj[key]; ++i)
      yield key;
}()];
console.log(output);

答案 3 :(得分:1)

使用Lodash函数forOwn

var result = [];
_.forOwn({cat: 2, dog: 1, bird: 4}, function(value, key){
    result.push(...Array(value).fill(key));
});

答案 4 :(得分:0)

我就是这样做的;

&#13;
&#13;
var arr = ["cat", "cat", "dog", "bird", "bird", "bird", "bird"],
    obj = arr.reduce((p,c) =>  (p[c] = p[c] ? ++p[c] : 1 ,p) ,{});
console.log(obj);
&#13;
&#13;
&#13;

好吧。星期五晚上,我不会很久,直到我说对了......(英尺)Sia)

&#13;
&#13;
var obj = {cat: 2, dog: 1, bird: 4},
    arr = Object.keys(obj).reduce((p,c) => p.concat((new Array(obj[c])).fill(c)) ,[]);
console.log(arr);
&#13;
&#13;
&#13;

再次抱歉......我猜现在一切都很好。

答案 5 :(得分:0)

投入快速的lodash解决方案,如果这是你的选择:

function mapObjectToArray(obj) {
  var arr = [];
  _.forIn(obj, function(value, key) {
    _.times(value, function() {
      arr.push(key);
    });
  });
  return arr;
}

var petCt =  {'cat': 2, 'dog': 1, 'bird': 3, 'ocelot': 0, 'sugar glider': 1};

<!DOCTYPE html>
<html>

  <head>
    <script data-require="lodash.js@4.6.1" data-semver="4.6.1" src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>

  <body>
    <pre id="resultArray"></pre>


  <script>
    var petCt =  {'cat': 2, 'dog': 1, 'bird': 3, 'ocelot': 0, 'sugar glider': 1};
    
    function mapObjectToArray(obj) {
      var arr = [];
      _.forIn(obj, function(value, key) {
        _.times(value, function() {
          arr.push(key);
        });
      });
      return arr;
    }
    
    var elem = document.getElementById('resultArray');
    elem.innerHTML = mapObjectToArray(petCt);
    
  </script>
  
  </body>
</html>