我有大约20个标签的tagsListtermIds这是最多3个标签id的数组。

我正在尝试在tagsList中找到与termIds中的ID匹配的标签,然后设置其边界。寻求避免循环和面向对象编程,而倾向于使用Ramda curry的功能编程解决方案。

tagsList中的标签如下所示:

{
    term: 'hi',
    id: 123
}


而termIds可能看起来像[123, 345, 678]

当我找到一个匹配的ID时,会给该标签一个新的键border1:trueborder2:true等。

目标:

有一个标签列表,我有另一个termIds数组,目标是查看是否在tagsList中的任何标签具有与termIds匹配的ID。如果是这样,给它一个border1,如果有2,那么第二个就得到border2,最后3个就得到边界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);


javascript - 如何使用数组项预加载Ramda curry 函数?-LMLPHP

最佳答案

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

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上。

07-24 16:48