以下函数应始终比较最长数组中的所有项目,并查看它们是否存在于较短的数组中。
现在以下代码可以工作了,但它有点冗长。
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]
是否有必要将两个变量arrLongest
和arrShortest
?还是有其他方法。
另一种编写方法是使用sort
和析构。
并重用现有参数:
const findSimilar = (arr1, arr2) => {
[arr1, arr2] = [arr1, arr2].sort((a, b) => a.length - b.length)
return arr2.filter((arrLongestItem) => arr1.includes(arrLongestItem));
};
或者继续使用arrShortest
和arrLongest
,因为变量确切包含的内容会更详细。
const findSimilar = (arr1, arr2) => {
const [arrShortest, arrLongest] = [arr1, arr2].sort((a, b) => a.length - b.length)
return arrShortest.filter((arrLongestItem) => arrLongest.includes(arrLongestItem));
};
我总是更喜欢正确命名的其他变量,而不是重用变量名称。
使用sort
的优点是它表达了所做的事情,并且您可以减少可能的错误,因为arr1
,arr2
表达式中只使用一次,而不是像?:
您肯定可以将其与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]