基于对象创build一个数组

我有一个对象,其中的值是整数。 如:{猫:2,狗:1,鸟:4}

我想创build一个数组,其中对象中的键包含在数组中的次数与该值相同。 因此,在这种情况下:[猫,猫,狗,鸟,鸟,鸟,鸟

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

我可以看到一种方法,我可以做到这一点 – 对于每个键我可以检索的价值,然后推单词数组的次数。 但是,这需要我的每个密钥(其中显着多于本例中)的几行代码。 我试过寻找更清洁的解决scheme,但没有运气。 有什么build议么?

演示: 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); 

一个function强大的方法是:

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

使用立即执行的生成器expression式,

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

用Lodash函数forOwn

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

我就是这样做的;

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

如果这是您的select,请立即使用lodash快速解决scheme:

 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>