我有大约20个标签的tagsList
和termIds
这是最多3个标签id的数组。
我正在尝试在tagsList中找到与termIds中的ID匹配的标签,然后设置其边界。寻求避免循环和面向对象编程,而倾向于使用Ramda curry的功能编程解决方案。
tagsList中的标签如下所示:
{
term: 'hi',
id: 123
}
而termIds可能看起来像
[123, 345, 678]
当我找到一个匹配的ID时,会给该标签一个新的键
border1:true
,border2: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);
最佳答案
这似乎是一种合理的方法:
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上。