Каков функциональный способ создания новой коллекции из объекта? - PullRequest
0 голосов
/ 27 февраля 2019

Какой способ создать эту коллекцию из этого объекта, который не мутирует.Могу ли я использовать lodash?

var obj = {Express: 2, Long_Haul: 1, Short_Haul: 1}

let collection = []

Object.keys(obj).forEach(key => collection.push({method: key, quantity: 
obj[key]}))

// output:
// [ { method: 'Express', quantity: 2 },{ method: 'Long_Haul', quantity: 1 },{ method: 'Short_Haul', quantity: 1 } ]

Ответы [ 4 ]

0 голосов
/ 28 февраля 2019

Вот решение использовать lodash

const obj = {Express: 2, Long_Haul: 1, Short_Haul: 1}
const collection = _.map(obj, (value, key) => ({method: key, quantity: value}))

Функция map вызовет iteratee с клавишей .Используйте одну _.map функцию, чтобы выполнить работу.

_.map(collection, [iteratee=_.identity])

Создает массив значений, выполняя каждый элемент в коллекции через iteratee.Итерируемый вызывается с тремя аргументами: (значение, индекс | ключ, коллекция).

https://lodash.com/docs/4.17.11#map

0 голосов
/ 27 февраля 2019

Вы можете использовать встроенную функцию из js, если используемый вами механизм js не предоставляет эти функции, вы можете использовать lodash.

let obj = {Express: 2, Long_Haul: 1, Short_Haul: 1}
let collection = _.map(_.toPairs(obj), function(arr) {
  return { method: arr[0], quantity: arr[1] };
});

console.log(collection);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
0 голосов
/ 28 февраля 2019

Вот решение в lodash, которое использует цепочку toPairs, map с частично примененным zipObject.

const collection = _(obj).toPairs()
    .map(_.partial(_.zipObject, ['method', 'quantity']))
    .value();

var obj = {Express: 2, Long_Haul: 1, Short_Haul: 1};

const collection = _(obj).toPairs()
	.map(_.partial(_.zipObject, ['method', 'quantity']))
	.value();
  
console.log(collection);
.as-console-wrapper{min-height:100%; top: 0}
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 27 февраля 2019

Используйте .map, чтобы превратить массив .entries объекта в массив объектов с нужными именами свойств:

var obj = {Express: 2, Long_Haul: 1, Short_Haul: 1}
const collection = Object.entries(obj)
  .map(([method, quantity]) => ({ method, quantity }));
console.log(collection);

Хотя вы можете использовать Lodash для этого, в этом нет необходимости, встроенные методы работают просто отлично.

...