Ramda: преобразовать массив значений ключа в объект - PullRequest
2 голосов
/ 28 марта 2020

Я использую Ramda для сортировки нормализованного объекта модели по ключу. Сначала я преобразовываю в пары ключ | значение (эквивалент Object.entries) и сортирую по первому значению, используя R.head (значение key в парах)

Я хочу преобразовать результирующий отсортированный массив пар в массив объектов - в примере кода я использую ES6 + map и array destructuring

const data = {
  2: {name: 'two'},
  1: {name: 'one'}
}

const sortByKey = R.compose(R.sortBy(R.head), R.toPairs);
const sortedPairs = sortByKey(data)
console.log(sortedPairs)
// [["1",{"name":"one"}],["2",{"name":"two"}]]

const objs = sortedPairs.map(([key, value]) => {
  return {[key]: value}
})
console.log(objs)
// [{"1":{"name":"one"}},{"2":{"name":"two"}}]

Часть, для которой не может быть найдена функция Ramda, равна

const objs = sortedPairs.map(([key, value]) => {
  return {[key]: value}
})

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Вы можете использовать R.map с примененным R.objOf для преобразования массива пар ([ключ, значение]) в объекты массива

const { compose, map, apply, objOf, sortBy, head, toPairs } = R

const sortByKey = compose(sortBy(head), toPairs)
const arrayFromPairs = map(apply(objOf))

const data = {
  2: {name: 'two'},
  1: {name: 'one'}
}

const result = arrayFromPairs(sortByKey(data))

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js"></script>
0 голосов
/ 04 апреля 2020

Вы можете использовать compose(fromPairs, of) для создания объекта из одной пары.

const fromPair = compose(fromPairs, of);
fromPair(["a", 1]);
//=> {"a": 1}

const { compose, fromPairs, head, map, of, sortBy, toPairs } = R;

const sortByKey = compose(sortBy(head), toPairs);
const fromPair = compose(fromPairs, of);
const arrayFromPairs = map(fromPair);

const data = {
  2: {name: 'two'},
  1: {name: 'one'},
};

const sortedPairs = sortByKey(data);
const objs = arrayFromPairs(sortedPairs);
console.log(objs);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.min.js"></script>
...