与排序数组比较数组,选择第一个元素。

3
安装步骤如下:

安装步骤如下:

targets = ['green','orange','red'];  //targets are in order of priority
sources = ['redalert','blackadder','greenlantern'];

我正在尝试编写一个函数,该函数返回包含最高优先级目标字符串的源元素。在这种情况下,它将是'greenlantern',因为它包含比'redalert'中的'red'更高优先级的字符串'green'。
我已经使用for循环和临时数组完成了此操作,但我知道这些操作并不是我的强项,而且我的现实数组要大得多,因此我希望优化执行。我也尝试过使用Lodash,但无法想出如何一步完成所有操作。这可能吗?
我认为它必须: - 对于每个目标,遍历源元素,如果源元素与目标元素匹配,则中断并返回。
但我相信有更好的方法。

源代码可以只包含一个目标,也可以包含任意数量的目标吗?因此,您也可以有“蓝色波浪”或“红绿苏格兰裙”。 - maraca
如果我得到多个包含最高优先级源的来源,我只会选择第一个。(“greenlantern”,“greenkilt”)返回任意数量的翻译文本。 - xShirase
好的,这样就容易多了,虽然如果你只是将这两个数组传递给函数,即使目标是恒定的,我仍然看不到快速的方法...我猜源数组不能被排序,否则就不需要这个函数了。所以你的算法似乎是最好的方法! - maraca
然而,我不知怎么的还是感到失望 :) 谢谢! - xShirase
不客气。我看到你接受了一个答案,这是一个很好的例子,但从性能上讲,你的方法更好,而且代码也不长。 - maraca
没错,我更注重风格而不是其他方面 :) 我讨厌嵌套的for循环。 - xShirase
2个回答

1
保持非常简单:

不做过多解释:

var sortedSources = _.sortBy(sources, function(source){
  var rank = 0
  while(rank < targets.length){
    if(source.indexOf(targets[rank]) > -1){
      break
    }else{
      rank++
    }
  }
  return rank
})

现在按目标优先级对源进行排序,因此sortedSources[0]是您的首选。

1
这里有另一种 lodash 方法,它使用 reduce() 而不是 sortBy()
_.reduce(targets, function(result, target) {
    return result.concat(_.filter(sources, function(source) {
        return _.includes(source, target);
    }));
}, []);

由于targets已经有序,因此您可以遍历它并按相同的顺序构建结果。您使用reduce(),因为您正在迭代地构建一个不是直接映射的结果。
在reduce回调内部,您可以使用filter()includes()来查找适当的sources,通过concat()结果。
这会给你一个已排序的数组,但如果你只想要与第一个target相对应的第一个source,它也会做很多不必要的工作:
_.find(sources, _.ary(_.partialRight(_.includes, _.first(targets)), 1));

或者,如果您不想编写回调函数:
_.find(sources, function(item) {
    return _.includes(item, _.first(targets));
});

基本上,find()只会在sources集合中迭代直到找到匹配项。first()函数可让您查找第一个要查找的target

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接