1

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

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

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?或者有没有别的办法。

4

2 回答 2

2

另一种编写它的方法是使用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));
};

我总是更喜欢正确命名的附加变量而不是重用变量名。

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

你肯定可以将它与CertainPerformancenew Set的答案结合起来

于 2019-12-08T09:37:14.743 回答
0

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

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)to降低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]

于 2019-12-08T09:08:27.493 回答