我有一个像这样的对象:
{ green: 2, blue: 1, red: 2}
如何将其转换为如下所示的数组:
[ 'green', 'green', 'blue', 'red', 'red']
答案 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)
将reduce
与Object.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.keys和Array.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.reduce和Object.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"]