Как создать массив из объекта, где количество элементов определяется Object.values? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть такой объект:

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

Как мне превратить его в массив, который выглядит следующим образом:

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

Ответы [ 6 ]

5 голосов
/ 20 июня 2019

Можно сделать так:

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);
0 голосов
/ 20 июня 2019

Использование карты и квартиры, если вы не хотите использовать flatMap напрямую

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"]
0 голосов
/ 20 июня 2019

В случае, если вы не хотите иметь дело с полифиллами для поддержки flatMap в IE и т. Д., Вы также можете рассмотреть это решение, которое основано только на 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)

Другой способ избежать деструктуризации массива ES6 - использовать Array.reduce и Object.entries :

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)
0 голосов
/ 20 июня 2019
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"]

1005 *

0 голосов
/ 20 июня 2019

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']
0 голосов
/ 20 июня 2019

Используйте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...