Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 比较数组和排序数组,选择第一个元素_Arrays_Lodash - Fatal编程技术网

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));
});