Javascript Рамда, как сделать R.find(R.propEq()) без учета регистра?

Есть ли способ сделать R.find(R.propEq()) нечувствительным к регистру для дерева объектов? (В настоящее время я использую библиотеки Ramda)

Это кусок моего дерева объектов:

  const objectTree = [ { __type: 'ix:ChecklistGridSection',
  For: 'QuestionAnswers',
  childNodes:
   [ { __type: 'Sorting', childNodes: [Array] },
     { __type: 'grouping', childNodes: [Array] },
     { __type: 'Tabs', childNodes: [Array] }, 
  ...

У меня есть такая функция, что я не могу изменить параметры:

R.find(R.propEq('__type', 'ix:checklistgridsection'))(objectTree);

Он будет работать только с ix:CheckListGridSection в качестве параметра, а не с ix:checklistgridsection. Мне нужно, чтобы это работало и для других листьев дерева.

Я думаю, что это плохое решение сделать все дерево строчными. Поэтому я подумал, есть ли способ сделать R.find(R.propEq()) нечувствительным к регистру.

1 ответ

R.propEq приравнивает значение prop к переданному значению, поэтому используется R.test.

Итак, вы можете использовать R.propSatisfies с R.test

R.find(R.propSatisfies(x => R.test(new RegExp('ix:checklistgridsection','i'), x), '__type'), objectTree)

Вы могли бы использовать propSatisfies вместо propEq как это:

const eqInsensitive = R.curry(
  (a, b) => String(a).toLowerCase() === String(b).toLowerCase()
)

R.find(
  R.propSatisfies(eqInsensitive('ix:checklistgridsection'), '__type'), 
  objectTree
)

Вы можете увидеть это в действии на Ramda REPL.

Это не относится к этому:

Мне нужно, чтобы это работало и для других листьев дерева.

Я не уверен, что вы хотите здесь. Рамда не будет автоматически обходить вашу древовидную структуру, пытаясь найти какой-либо дочерний элемент, который соответствует предикату. Вам нужно будет создать эту инфраструктуру самостоятельно. Но это же find должен работать против любого уровня дерева.

Другие вопросы по тегам