我有一个对象,我想用对象属性填充数组,并根据其值重复每个属性多次。一个例子:
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' ]
答案 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)
答案 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.reduce
和Object.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
,可以使用正确的长度设置数组,然后用相同的值填充数组。