我有一个看起来像这样的对象:
const object = {
head: 1,
eyes: 2,
arms: 2,
legs: 3
}
我想循环遍历此对象,然后注销每个密钥名称,例如eyes
表示价值金额。
这将导致:
head
eyes
eyes
arms
arms
legs
legs
legs
目前我有这个解决方案,但感觉它可以更加整洁和可读。
Object.keys(object)
.map(key => {
return [...Array(object[key])].map( (_, i) => {
return console.log(key)
})
有什么建议吗?
答案 0 :(得分:4)
您可以使用Object.entries()
和map()
方法并返回新数组。
const object = {head: 1,eyes: 2,arms: 2,legs: 3}
const res = [].concat(...Object.entries(object).map(([k, v]) => Array(v).fill(k)))
console.log(res)

或者您可以在数组中使用reduce()
扩展语法。
const object = {head: 1,eyes: 2,arms: 2,legs: 3}
const res = Object
.entries(object)
.reduce((r, [k, v]) => [...r, ...Array(v).fill(k)], [])
// Or you can use push instead
// .reduce((r, [k, v]) => (r.push(...Array(v).fill(k)), r), [])
console.log(res)

答案 1 :(得分:3)
Object.entries(object)
.forEach(([key, times]) => console.log((key + "\n").repeat(times)));
可以使用String.prototype.repeat
...
答案 2 :(得分:2)
“......感觉它可以做得更整齐,更容易阅读。”
递归使它非常干净且易于理解。
const object = {
head: 1,
eyes: 2,
arms: 2,
legs: 3
};
Object.entries(object).forEach(function f([k,v]) {
if (v) {
console.log(k);
f([k, --v]);
}
})
如果你知道价值总是大于0
,你可以重新安排一些事情。
const object = {
head: 1,
eyes: 2,
arms: 2,
legs: 3
};
Object.entries(object).forEach(function f([k,v]) {
console.log(k);
if (--v) f([k, v]);
})