我有一个值为整数的对象。就像是: {cat:2,dog:1,bird:4}
我想创建一个数组,其中对象中的键与数值包含的次数相同。所以,在这个例子中: [" cat"," cat"," dog"," bird"," bird","鸟",鸟"]
键始终相同,但值可能为零。
我可以看到一种方法可以做到 - 对于每个键,我可以检索该值,然后将该单词推送到该数组的次数。但是,对于我的每个键,这需要几行代码(其中的代码明显多于此示例中的代码)。我曾尝试寻找更清洁的解决方案,但没有运气。有什么建议吗?
答案 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)
这样做的一个非常实用的方法是:
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;
它的作用基本上是对象的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)
我就是这样做的;
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;
好吧。星期五晚上,我不会很久,直到我说对了......(英尺)Sia)
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;
再次抱歉......我猜现在一切都很好。
答案 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>