Javascript 总是在最长的数组上运行一个函数,并在该函数中使用最短的数组



以下函数应始终比较最长数组中的所有项目,并查看它们是否存在于较短的数组中。

现在以下代码可以工作了,但它有点冗长。

const findSimilar = (arr1, arr2) => {
const arrLongest = (arr1.length < arr2.length) ? arr2 : arr1;
const arrShortest = (arr1.length < arr2.length) ? arr1 : arr2;
return arrLongest.filter((arrLongestItem) => arrShortest.includes(arrLongestItem));
};
console.log(findSimilar([1,2,3,4,3], [1,2,3])); // (3) [1, 2, 3, 3]
console.log(findSimilar([1,2,3], [1,2,3,4,3])); // (4) [1, 2, 3, 3]

是否有必要将两个变量arrLongestarrShortest?还是有其他方法。

另一种编写方法是使用sort和析构。

并重用现有参数:

const findSimilar = (arr1, arr2) => {
[arr1, arr2] = [arr1, arr2].sort((a, b) => a.length - b.length)
return arr2.filter((arrLongestItem) => arr1.includes(arrLongestItem));
};

或者继续使用arrShortestarrLongest,因为变量确切包含的内容会更详细。

const findSimilar = (arr1, arr2) => {
const [arrShortest, arrLongest] = [arr1, arr2].sort((a, b) => a.length - b.length)
return arrShortest.filter((arrLongestItem) => arrLongest.includes(arrLongestItem));
};

我总是更喜欢正确命名的其他变量,而不是重用变量名称。

使用sort的优点是它表达了所做的事情,并且您可以减少可能的错误,因为arr1arr2表达式中只使用一次,而不是像?:

您肯定可以将其与CertainPerformance的答案中的new Set相结合

您可以只使用一次条件运算符,然后分解为数组的两个变量:

const findSimilar = (arr1, arr2) => {
const [arrLongest, arrShortest] = (arr1.length < arr2.length) ? [arr2, arr1] : [arr1, arr2];
return arrLongest.filter((arrLongestItem) => arrShortest.includes(arrLongestItem));
};
console.log(findSimilar([1,2,3,4,3], [1,2,3])); // (3) [1, 2, 3, 3]
console.log(findSimilar([1,2,3], [1,2,3,4,3])); // (4) [1, 2, 3, 3]

要将计算复杂度从O(n^2)降低到O(n),请改用 Set 作为最短数组:

const findSimilar = (arr1, arr2) => {
const [arrLongest, arrShortest] = (arr1.length < arr2.length) ? [arr2, arr1] : [arr1, arr2];
const shortSet = new Set(arrShortest);
return arrLongest.filter(shortSet.has, shortSet);
};
console.log(findSimilar([1,2,3,4,3], [1,2,3])); // (3) [1, 2, 3, 3]
console.log(findSimilar([1,2,3], [1,2,3,4,3])); // (4) [1, 2, 3, 3]

最新更新