从另一个数组中的数组中查找元素的第一个匹配项

问题描述

我很好奇是否有一个很好的方法可以从另一个数组中的数组中查找元素的第一次出现。 结果,答案应该为null(如果第二个数组中的第一个数组中没有元素)或该元素。 示例1:

fromArr = ["Yellow","Green","Orange","Apple","Banana","Apple"];
whereArr= ["Apple","Apple"];

//答案应该是“橙色”,因为顺序很重要(首先我们检查“黄色”,然后检查“绿色”,然后检查“橙色”-出现了!)。

示例2:

fromArr = ["Orange","Apple"];
whereArr= ["November","December","April","Banana"];

//答案应该是“香蕉”。

示例3:

fromArr = ["Orange","April"];

//答案应该为空。

谢谢

解决方法

您可以在fromArr上使用.find(),并将whereArr转换为Set,以实现高效(亚线性)查找。 .find()将遍历fromArr中的所有值,直到回调返回true。回调返回true后,.find()将返回您当前迭代的值。您可以使用.has()检查集合中是否有值,当值在集合中时,它将返回true。如果find的回调未对fromArr中的任何值返回true,则将导致undefined

请参见以下示例:

const fromArr = ["Yellow","Green","Orange","Apple","Banana","Apple"];
const whereSet = new Set(["Apple","Apple"]);

const result = fromArr.find(val => whereSet.has(val));
console.log(result);

,

您可以通过在“ fromArr”数组上使用“ find”并比较条目是否包含在“ whereArr”数组中来轻松实现此目的。

示例:

fromArr = ["Yellow","Apple"];
whereArr = ["Apple","Apple"];
fromArr.find(e => whereArr.includes(e));
,

您可以使用fromArr的项目的索引号创建对象。然后检查whereArr数组的每个元素,以及哪个项目的索引(从哈希值)最小(这是第一次出现)。此方法需要O(n+m)时间。

function getFirstOccurance(fromArr,whereArr) {
  const indics = fromArr.reduce((acc,curr,i) => ({...acc,[curr]: i}),{});

  let min = Number.MAX_SAFE_INTEGER;
  let res = null;
  whereArr.forEach(item => {
    if (indics[item] < min) {
      min = indics[item];
      res = item;
    }
  });

  return res;
}

let arr = ["Yellow","Apple"];
let arr2= ["Apple","Apple"];
console.log(getFirstOccurance(arr,arr2));

arr = ["Orange","Apple"];
arr2 = ["November","December","April","Banana"];
console.log(getFirstOccurance(arr,"Apple"];
arr2= ["November","April"];
console.log(getFirstOccurance(arr,arr2));
.as-console-wrapper{min-height: 100%; top: 0}