基于对象创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>