рамда / функциональное программирование - разные логики c в зависимости от состояния - PullRequest
1 голос
/ 02 мая 2020

Я новичок в функциональном программировании и хочу go просмотреть коллекцию и найти элемент на основе условия. Условие следующее, но мне интересно, есть ли более элегантный способ написать его функциональным способом (ниже используется Ramda):

import * as R from "ramda";

const data = [{x: 0, y: 0} , {x: 1, y: 0}];

//return the cell which matches the coord on the given orientation
function findCell(orientation, coord) {

  const search = R.find(cell => {
    if (orientation === "x") {
      return cell.x === coord;
    } else {
      return cell.y === coord;
    }
  });

  return search(data);
}

findCell("x", 0);

Есть ли более элегантный способ написать этот предикат в любом Рамда или какая-то другая функциональная JS библиотека?

1 Ответ

3 голосов
/ 02 мая 2020

R.propEq - подходящий предикат для того, что вы ищете (поиск по значению свойства). Используйте R.pipe для создания функции, которая принимает свойство и значение, передает их в R.propEq и возвращает функцию R.find с предикатом.

const { pipe, propEq, find } = R;

const findCell = pipe(propEq, find);

const data = [{x: 0, y: 0} , {x: 1, y: 0}];

const result = findCell('x', 0)(data);

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

Вы можете сделать то же самое с ванилью JS, используя Array.find():

const findCell = (prop, value, arr) => arr.find(o => o[prop] === value)

const data = [{x: 0, y: 0} , {x: 1, y: 0}];

const result = findCell('x', 0, data);

console.log(result);
...