Arrays 比较数组和排序数组,选择第一个元素
设置如下所示:Arrays 比较数组和排序数组,选择第一个元素,arrays,lodash,Arrays,Lodash,设置如下所示: targets = ['green','orange','red']; //targets are in order of priority sources = ['redalert','blackadder','greenlantern']; 我试图创建一个函数,返回一个源元素,其中包含最高优先级的目标字符串。在本例中,它将是“Greenletter”,因为它包含字符串“green”,其优先级高于“redalert”中的“red” 我已经用for循环和temp数组完成了,但
targets = ['green','orange','red']; //targets are in order of priority
sources = ['redalert','blackadder','greenlantern'];
我试图创建一个函数,返回一个源元素,其中包含最高优先级的目标字符串。在本例中,它将是“Greenletter”,因为它包含字符串“green”,其优先级高于“redalert”中的“red”
我已经用for循环和temp数组完成了,但是我知道这些操作不是我的强项,而且我的实际数组要大得多,所以我想优化执行。我也试过使用Lodash,但不知道如何一步完成。可能吗
在我看来,它必须:
对于每个目标,循环源元素,如果源元素与目标元素匹配,则中断并返回。
但我相信有更好的方法。保持简单:
var sortedSources = _.sortBy(sources, function(source){
var rank = 0
while(rank < targets.length){
if(source.indexOf(targets[rank]) > -1){
break
}else{
rank++
}
}
return rank
})
var sortedSources=u.sortBy(源、函数(源){
变量秩=0
while(等级<目标长度){
if(source.indexOf(targets[rank])>-1){
打破
}否则{
等级++
}
}
返回等级
})
源现在按目标优先级排序,因此,
sortedSources[0]
是您的人。这里是另一种使用lodash方法,而不是:
由于targets
已按顺序排列,因此可以对其进行迭代,并按相同的顺序生成结果。您使用reduce()
,因为您以迭代方式构建结果,这不是直接映射
在reduce回调中,您可以通过使用和查找适当的源来concat()
结果
这将获得排序数组,但如果只需要与第一个目标对应的第一个源,它也会做很多不必要的工作:
或者,如果您不希望编写回调函数:
本质上,将只在源代码
集合上迭代,直到找到匹配项为止。该函数将获取要查找的第一个目标。源能否仅包含一个目标或任意数量?所以你也可以选择“蓝色波浪”或“红绿色短裙”?任何数量。如果我得到多个包含最高优先级源的源,我只选择第一个。('greenlantern','greenkilt')好的,这使它更容易,尽管我仍然看不到快速的方法,如果您只是将这两个数组传递给函数,即使目标是常量。。。在我猜之前,不能对源代码进行排序,否则就不需要该函数了。因此,您的算法似乎是最好的方法!然而,我还是有些失望:)谢谢!不客气。我看到您接受了一个答案,这是一个很好的例子,但性能方面,您的方法更好,代码也不会更长。
_.reduce(targets, function(result, target) {
return result.concat(_.filter(sources, function(source) {
return _.includes(source, target);
}));
}, []);
_.find(sources, _.ary(_.partialRight(_.includes, _.first(targets)), 1));
_.find(sources, function(item) {
return _.includes(item, _.first(targets));
});