gpt4 book ai didi

javascript - 如何使用数组项预加载 Ramda 柯里化(Currying)函数?

转载 作者:行者123 更新时间:2023-12-03 05:22:24 26 4
gpt4 key购买 nike

我有 tagsList,其中包含大约 20 个标签,以及 termIds,它是最多包含 3 个标签 ID 的数组。

我试图找到与 tagList 中 termIds 中的 id 匹配的标签,然后设置它们的边框。希望避免 for 循环和面向对象编程,转而使用 Ramda curry 的函数式编程解决方案。 .

tagsList 中的标签如下所示:

{
term: 'hi',
id: 123
}

termId 可能类似于 [123, 345, 678]

当我找到匹配的 id 时,我会为该标签提供一个新键 border1:trueborder2:true 等...

目标:

有一个标签列表,我有另一个 termIds 数组,目标是查看tagsList 中是否有任何标签具有与 termIds 匹配的 id。如果有,则给它一个 border1,如果有 2 个,则第 2 个得到 border2,最后 3 个得到 border 3。

<小时/>

我首先尝试的:

const checkId = _.curry((term_id, tag) => {
if (tag.id === term_id) {
console.log('match found!', tag)
}
});

const matchId = checkId(termIds);

const coloredTags = R.map(matchId, tagsList);
console.log('coloredTags', coloredTags)
return tagsList;

但是这不起作用,因为我将整个 termIds 数组预加载到 checkId 函数中。相反,我想用单个项目预加载它。

接下来我尝试了这个,我认为它会起作用,但出现了一个奇怪的错误:

const matchId = R.forEach(checkId, termIds);

enter image description here

最佳答案

这似乎是一个合理的方法:

R.map(tag => {
const index = R.indexOf(tag.id, termIds);
return (index > -1) ? R.assoc('border' + (index + 1), true, tag) : tag
})(tagsList);

//=> [
// {id: 123, term: "hi", border1: true},
// {id: 152, term: "ho"},
// {id: 345, term: "hu", border2: true},
// {id: 72, term: "ha"}
// ]

尽管通过足够的努力可能可以使其成为无积分的,但它的可读性可能会低得多。

您可以在 Ramda REPL 上看到此操作的实际效果。

如果你想把它变成一个可重用的函数,你可以这样做:

const addBorders = R.curry((terms, tags) => R.map(tag => {
const index = R.indexOf(tag.id, terms);
return (index > -1) ? R.assoc('border' + (index + 1), true, tag) : tag
})(tags))

addBorders(termIds, tagsList)

(对 curry 的调用是 Ramda 的习惯。这意味着您可以调用 addBorders(termIds) 并返回一个正在查找标签的可重用函数。如果你不需要它,你可以跳过 curry 包装器。)

这个版本也在Ramda REPL

关于javascript - 如何使用数组项预加载 Ramda 柯里化(Currying)函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com