Как изменить массив внутри массива объектов в моем редукторе с помощью Ramda? - PullRequest
0 голосов
/ 09 июля 2020

У меня есть объект в моем состоянии, например:

введите описание изображения здесь

У меня есть свойство sections, то есть массив объектов, я хочу добавить элемент в массив geometri_linestring указанного объекта c в массиве sections, для этого я сделал это в своем редукторе:

const setPointSuccess = curry(({ point }, state) => {
  const activeTronconId = point.activeTroncon;
  let circuit = state.addedCircuit;
  let sections = circuit.sections;
  let troncon = sections.filter(section => section.tronconId === activeTronconId)[0];
  let disabledTroncons = sections.filter(section => section.tronconId !== activeTronconId);
  const { latitude, longitude } = point;
  let geoLineString = troncon.geometri_linestring;
  geoLineString.push({ latitude, longitude });

  troncon.geometri_linestring = geoLineString;
  disabledTroncons.push(troncon);
  sections = disabledTroncons;
  circuit.sections = sections;
  let addedCircuit = circuit;

  return {
    ...state,
    addedCircuit,
  };
});

Итак, я думаю, что это плохой код, он может быть лучше, используя выражения ramda, но я не могу думать об этом, так как я так глубоко погрузился в этот объект.

Есть ли более простой способ сделать это?

Любая помощь будет принята с благодарностью.

1 Ответ

2 голосов
/ 09 июля 2020

Я не уверен, спрашиваете ли вы о редукторах redux, и в этом случае я бы посоветовал вам избегать таких методов, как push, поскольку они изменяют данный ввод ...

Кроме того, Ramda и fp в целом продвигает неизменный подход к преобразованию данных ...

__ Следующее должно помочь вам сделать то, что вам нужно, конечно, вам нужно будет найти раздел (индекс), с которым вам нужно работать.

const addCoordinates = (section, coords, state) => R.over(
  R.lensPath(['sections', section, 'geometry_linestring']),
  R.append(coords),
  state,
);

// ====

const state = {
  sections: [
    {
      geometry_linestring: [
        { longitude: 10, latitude: 20 },
        { longitude: 50, latitude: -320 },
      ],
    }
  ],
};


console.log(
  addCoordinates(0, { message: 'Hello World' }, state),
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha512-P+CxnI2T1ohL0L2CCoq/FZmfTms2+pOw5xxeYghPovQAmBDdQb6E7Yk74lB/v84c046R1fM2ecfAhFsPzleAag==" crossorigin="anonymous"></script>
...