#javascript #ramda.js
#javascript #ramda.js
Вопрос:
Я пытаюсь преобразовать массив объектов в массив целых чисел, извлекая значения из этих объектов с помощью Ramda.js . Мне нужно сохранить только участников узла со значениями uid, однако, похоже, что я делаю это неправильно.
Я хочу преобразовать это
var listObejcts = {
"participants": [
{
"entity": {
"uid": 1
}
},
{
"entity": {
"uid": 2
}
}
]
}
к этому:
{
"participants": [1, 2]
}
Я пробовал приведенный выше код, но он не сработал. Он по-прежнему возвращает список объектов.
var transform = pipe(
over(lensProp('participants'), pipe(
filter(pipe(
over(lensProp('entity'), prop('uid'))
))
))
)
console.log(transform(listObejcts))
Кто-нибудь знает, как я мог бы этого добиться?
Здесь можно отредактировать код — https://repl.it/repls/PrimaryMushyBlogs
Ответ №1:
Одна из возможностей — объединить evolve
с map
( path
) следующим образом:
const transform = evolve({participants: map(path(['entity', 'uid']))})
var listObjects = {participants: [{entity: {uid: 1}}, {entity: {uid: 2}}]}
console.log(transform(listObjects))
<script src="https://bundle.run/ramda@0.26.1"></script><script>
const {evolve, map, path} = ramda </script>
Хотя я уверен, что существует решение на основе lens, эта версия выглядит довольно простой.
Обновить
Решение, основанное на lens
, безусловно, возможно. Вот один из таких:
var transform = over(
lensProp('participants'),
map(view(lensPath(['entity', 'uid'])))
)
var listObjects = {participants: [{entity: {uid: 1}}, {entity: {uid: 2}}]}
console.log(transform(listObjects))
<script src="https://bundle.run/ramda@0.26.1"></script><script>
const {over, lensProp, map, view, lensPath} = ramda </script>
Ответ №2:
Также можно использовать только чистый JavaScript es6:
const uidArray = listObjects.participants.map(({ entity: { uid } }) => uid);
Ответ №3:
Ну, вы можете сделать это в Ramda, но вы можете просто использовать VanillaJS ™ для этого и получить быстрое, однострочное решение без библиотек:
const obj = {
participants: [
{entity: {uid: 1}},
{entity: {uid: 2}}
]
}
obj.participants = obj.participants.map(p => p.entity.uid);
console.log(obj);
Комментарии:
1. Просто чтобы вы знали, кто-то, кто ищет решение Ramda, вероятно, не заинтересован в методе, который изменяет входные данные. Конечно, это можно было бы легко исправить, чтобы этого не делать.
2. Я действительно не знаком с философией Ramda, спасибо за информацию! Я просто выбрал самое простое решение, которое соответствовало требованиям OP
3. чтобы соответствовать требованиям Op, вам нужно было использовать ramda… Изменение входных данных не является опцией в fp.