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
должен работать против любого уровня дерева.