Преобразовать ключ объекта в массив со значениями номера ключа с помощью Lodash - PullRequest
0 голосов
/ 07 октября 2019

У меня есть объект с продуктами:

products: {
  bread: 1,
  milk: 2,
  cheese: 2,
  chicken: 1,
}

Я хотел бы иметь массив с названием продуктов, таких как:

products: ['bread', 'milk', 'milk', 'cheese', 'cheese', 'chicken']

Я пытался использовать lodash с reduce методом, но я не знаю, как «умножить» этот продукт в массиве.

Я думаю, что это не очень хорошая идея:

_.reduce(products, (result, value, key) => {
  for(let i = 0; i < value; i++) {
   result.push(key);
  }
  return result;
}, [])

Так что, если кто-то могпомогите, буду благодарен.

Ответы [ 2 ]

4 голосов
/ 07 октября 2019

Вы можете использовать flatMap над записями объекта

const products = {
  bread: 1,
  milk: 2,
  cheese: 2,
  chicken: 1,
}

const output = Object.entries(products).flatMap(([k, v]) => Array(v).fill(k))

console.log(output)
0 голосов
/ 07 октября 2019

С lodash вы можете перебирать массив с _.flatMap(). Создайте обратный вызов, используя _.overArgs(), который передаст значение (через _.identity()) и ключ (обернутый _.constant()) в _.times():

const obj = {
  products: {
    bread: 1,
    milk: 2,
    cheese: 2,
    chicken: 1,
  }
}

const result = _.flatMap(obj.products, _.overArgs(_.times, [_.identity, _.constant]))
  
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
...