Вставить новый объект в массив Рамда - PullRequest
1 голос
/ 04 ноября 2019

Рамда имеет функцию вставки . Но в моем случае я не знаю, как просверлить объект и вставить новый объект в массив. Также новый объект должен быть в последнем индексе массива, мы можем получить его через stuff["31"].length. Мои попытки были слишком жалкими, поэтому я решил не показывать их: /

Модель данных:

const stuff = {
  "31": [
    {
      "id": "11",
      "title": "ramda heeeelp"
    },
    {
      "id": "12",
      "title": "ramda 123"
    },
    //HERE I WANT TO INSERT A NEW OBJECT - {id: "13", title: "new title"}
  ],
  "33": [
    {
      "id": "3",
      "title": "..."
    }
  ],
  "4321": [
    {
      "id": "1",
      "title": "hello world"
    }
  ]
}

Ответы [ 3 ]

2 голосов
/ 04 ноября 2019

Это прямое использование линз, с добавлением append в конец.

Вот как я бы это сделал:

const addObjToGroup = (groupId, newObj, data) => 
  over (lensProp (groupId), append (newObj), data)

const stuff = {"31": [{"id": "11", "title": "ramda heeeelp"}, {"id": "12", "title": "ramda 123"}], "33": [{"id": "3", "title": "..."}], "4321": [{"id": "1", "title": "hello world"}]}

console .log (
  addObjToGroup ('31', {id: "13", title: "new title"}, stuff)
)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
<script>const {over, lensProp, append} = R                           </script>
1 голос
/ 05 ноября 2019

также R.useWith помогает здесь!

const appendTo = R.useWith(R.over, [
  R.lensProp,
  R.append,
  R.identity
]);


// ---
const stuff = {
  "31": [
    {
      "id": "11",
      "title": "ramda heeeelp"
    },
    {
      "id": "12",
      "title": "ramda 123"
    },
    //HERE I WANT TO INSERT A NEW OBJECT - {id: "13", title: "new title"}
  ],
  "33": [
    {
      "id": "3",
      "title": "..."
    }
  ],
  "4321": [
    {
      "id": "1",
      "title": "hello world"
    }
  ]
}

console.log(
  appendTo('31', 'HELLO WORLD', stuff),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js" integrity="sha256-xB25ljGZ7K2VXnq087unEnoVhvTosWWtqXB4tAtZmHU=" crossorigin="anonymous"></script>
1 голос
/ 05 ноября 2019

Вы также можете использовать evolve для добавления элемента в массив в groupId:

const { evolve, append } = R

const addObjToGroup = (groupId, newObj) => evolve({ [groupId]: append(newObj) })

const stuff = {"31": [{"id": "11", "title": "ramda heeeelp"}, {"id": "12", "title": "ramda 123"}], "33": [{"id": "3", "title": "..."}], "4321": [{"id": "1", "title": "hello world"}]}

const result = addObjToGroup ('31', {id: "13", title: "new title"})(stuff)

console .log (result)
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
...