如何从对象生成数组,其中元素的数量由Object.values确定?

时间:2019-06-19 21:31:38

标签: javascript arrays object javascript-objects

我有一个像这样的对象:

{ green: 2, blue: 1, red: 2}

如何将其转换为如下所示的数组:

[ 'green', 'green', 'blue', 'red', 'red']

7 个答案:

答案 0 :(得分:5)

可以这样做:

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

示例:

const obj = { green: 2, blue: 1, red: 2};
const res = Object.entries(obj).flatMap(([k, v]) => Array(v).fill(k));
console.log(res);

答案 1 :(得分:1)

这是使用生成器的一种巧妙方法。对于这个例子,也许有些矫kill过正。

function* makeIterator(obj) {
    const keys = Object.keys(obj);
    for (const key of keys) {
        const value = obj[key];
        for (let i = 0; i < value; i++) {
            yield key;
        }
    }
}

const obj = {green: 2, blue: 1, red: 2};
console.log(Array.from(makeIterator(obj)));

答案 2 :(得分:0)

reduceObject.entries一起使用:

const obj = { green: 2, blue: 1, red: 2};
const res = Object.entries(obj).reduce((a, [k, v]) => (a.push(...new Array(v).fill(k)), a), []);

console.log(res);

答案 3 :(得分:0)

Object.entries将执行此操作-它提供了一个键:对象中每个属性的值对。然后,您可以使用该值将键推入可提供所需输出的数组中。

var obj = { green: 2, blue: 1, red: 2};

var newArr = [];
var objEntries = Object.entries(obj);

objEntries.forEach(function(item){
  for(var i = 0; i < item[1]; i++){
   newArr.push(item[0])
  };
})

console.log(newArr); // gives //[ 'green', 'green', 'blue', 'red', 'red']

答案 4 :(得分:0)

var data={ green: 2, blue: 1, red: 2};
var newData=[];
for(let i in data){
    for(let j=0;j<data[i];j++){
        newData.push(i);
    }
}
console.log('newData = ', newData);

输出

newData = ["green", "green", "blue", "red", "red"]

答案 5 :(得分:0)

如果您不想在IE中处理flatMap support的策略填充,也可以考虑仅基于Object.keysArray.forEach的此解决方案:

let obj = {green: 2, blue: 1, red: 2}, arr=[]

Object.keys(obj).forEach(x => arr.push(...Array(obj[x]).fill(x)))

console.log(arr)

可以通过Array.reduceObject.entries来避免ES6阵列破坏的另一种方法:

let obj = {green: 2, blue: 1, red: 2}

let r = Object.entries(obj).reduce((r,[k,v]) => r.concat(Array(v).fill(k)),[])

console.log(r)

答案 6 :(得分:0)

如果不想直接使用flatMap,请使用地图和flat

const obj = { 
   green: 2, 
   blue: 1, 
   red: 2
};

const responseArray = Object.entries(obj)
    .map(([key,value]) => {
        return Array(value).fill(key)
}).flat();

console.log(responseArray);
//  ["green", "green", "blue", "red", "red"]