循环对象es6

时间:2017-12-23 16:59:56

标签: javascript ecmascript-6

我有一个看起来像这样的对象:

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

有什么建议吗?

3 个答案:

答案 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]);
})