Как преобразовать массив объектов в массив целых чисел, извлекая значения из этих объектов с помощью ramda.js ?

#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.