如何基于动态变量将元素推入数组

时间:2018-12-07 22:48:09

标签: javascript arrays sorting

我有一个对象,我想用对象属性填充数组,并根据其值重复每个属性多次。一个例子:

obj = {
   watches: 3
   rings: 1
}
// => ['watches', 'watches', 'watches', 'rings']

以下是我到目前为止的内容。我很难确定如何根据关联的值重复每个属性?

function arrayBuilder(obj) {
  let objToArr = [];

  for (let [property, value] of Object.entries(obj)) {
    objToArr.push(property);
  }
  return objToArr;
}

console.log(arrayBuilder({watches: 3, rings: 1}));
// => [ 'watches', 'rings' ]

6 个答案:

答案 0 :(得分:2)

您只是缺少一个内循环:

function arrayBuilder(obj) {
  let objToArr = [];

  for (let [property, value] of Object.entries(obj)) {
    for(var i=0; i<value; i++){
      objToArr.push(property);
    }
  }
  return objToArr;
}

console.log(arrayBuilder({watches: 3, rings: 1}));

答案 1 :(得分:2)

您可以将Array.flatMap()Array.fill()一起使用(注意支持):

const obj = {
   watches: 3,
   rings: 1
}

const result = Object.entries(obj).flatMap(([k, v]) => Array(v).fill(k));

console.log(result);

或者将Array.reduce()array spread一起使用(如果不支持flatMap:

const obj = {
   watches: 3,
   rings: 1
}

const result = Object.entries(obj)
  .reduce((r, [k, v]) => [...r, ...Array(v).fill(k)], []); // or r.concat(Array(v).fill(k)) instead of the spread

console.log(result);

答案 2 :(得分:1)

只需添加另一个循环:

 for (let [property, value] of Object.entries(obj)) {
   for(let i = 0; i < value; i++) {
     objToArr.push(property);
   }
 }

答案 3 :(得分:1)

要获得预期结果,请使用以下选项使用重复和拆分方法

var obj = {
   watches: 3,
   rings: 1
}
let result = []
for(key in obj){
  result.push(...key.concat(" ").repeat(obj[key]).trim().split(" "))
}

console.log(result)

codepen-https://codepen.io/nagasai/pen/ZVzoGB?editors=0010

答案 4 :(得分:1)

浏览各个键,为每个键创建所需长度的数组,并用键名和combine the resulting arrays填充结果数组:

function arrayBuilder(obj) {
  return [].concat.apply(
    [],
    Object
      .entries(obj)
      .map(([key, value]) => new Array(value).fill(key))
  )
}
console.log(arrayBuilder({watches: 3, rings: 1}))

答案 5 :(得分:1)

您可以通过Array.reduceObject.keys进行此操作:

const obj = { watches: 3, rings: 1 }

const result = Object.keys(obj).reduce((acc, key) => 
   [...acc, ...new Array(obj[key]).fill(key)], [])

console.log(result)

这个想法是从对象中获取键,并使用它们来获取Array.fill所需的数组的长度。使用Array.fill,可以使用正确的长度设置数组,然后用相同的值填充数组。