提升 JavaScript 水平的 9 个基本数组难题 [JS 基础]( 二 )

更高级的或者更确切地说是 ES6 版本使用扩展运算符 (...) 。扩展运算符将数组的元素扩展为单独的参数 。
这就是它的样子
const merged = [...arr1, ...arr2];console.log(merged); // [1, 2, 3, 4, 5, 6]有两种方法:

  • 创建一个包含两个数组元素的新数组
  • 不要修改原始数组 。
如果你不介意修改源数组,您可以简单地使用 .push() 将另一个数组的元素添加到第一个数组的末尾 。
arr1.push(...arr2);console.log(arr1); // [1, 2, 3, 4, 5, 6]返回 2 个数组之间的差异有以下几种区别:
  • 非对称的
  • 对称的
非对称
  • 在第一个数组中但不在第二个数组中的元素
对称
  • 在第一个数组中但不在第二个数组中的元素,以及在第二个数组中但不在第一个数组中的元素
以下是如何使用 filter() 方法查找两个数组之间的非对称差异:
const arr1 = [1, 2, 3, 4, 5];const arr2 = [3, 4, 5, 6, 7];const difference = arr1.filter(x => !arr2.includes(x));console.log(difference); // [1, 2]以下是为了获得对称差异:
const arr1 = [1, 2, 3, 4, 5];const arr2 = [3, 4, 5, 6, 7];const difference = arr1.filter(x => !arr2.includes(x)).concat(arr2.filter(x => !arr1.includes(x)));console.log(difference); // [1, 2, 6, 7]这种方法返回一个新数组并且不修改原始数组 。
或者,您可以使用 Set 对象及其 .has() 而不是 .includes()
非对称差异:
const set = new Set(arr2);const difference = arr1.filter(x => !set.has(x));console.log(difference); // [1, 2]对称差异:
const set = new Set(arr2);const set1 = new Set(arr1)const difference = arr1.filter(x => !set.has(x)).concat(arr2.filter(x => !set1.has(x)));console.log(difference); // [1, 2, 6, 7]如何检查数组是否包含重复元素最简单的方法是使用 Set 对象和 size 属性 。
Set 对象仅存储唯一值,因此您可以从数组创建一个集合并将该集合的大小与原始数组的大小进行比较 。
如果集合的大小小于数组的大小,则意味着数组包含重复元素 。
以下是您的操作方式:
const arr = [1, 2, 3, 4, 5, 5];const hasDuplicates = new Set(arr).size !== arr.length;console.log(hasDuplicates); // true您可以使用对象(也称为散列或字典)实现相同的目的
当您遍历数组时,您将当前值设置为键,将 true 设置为键的值 。
如果您尝试访问一个键并且那里已经有一个值,则意味着您找到了一个重复项 。
这是其中一种方法:
const hasDuplicates = (arr) => {let hash = {}for(let i = 0; i < arr.length; i++){if(!hash[arr[i]]){hash[arr[i]] = true} else {return true;}}return false}console.log(hasDuplicates(arr)); // true这两种方法都创建一个新对象(集合或哈希对象)并且不修改原始数组 。它们还具有线性时间复杂度(它们对大型数组很有效) 。
如何返回两个数组之间的交集最常见的方法是使用 filter() 和 includes() 。
代码如下:
const arr1 = [1, 2, 3, 4, 5];const arr2 = [3, 4, 5, 6, 7];const intersection = arr1.filter(x => arr2.includes(x));console.log(intersection); // [3, 4, 5]这种方法返回一个新数组并且不修改原始数组 。
作为替代方案,您可以(再次)使用 Set 对象和 .has() 方法
const set = new Set(arr2);const intersection = arr1.filter(x => set.has(x));console.log(intersection); // [3, 4, 5]你看到模式了吗? 每当使用普通对象解决问题时,您都可以使用 Set创建一个版本,反之亦然 。
如何找到数组中最长的字符串为此,您可以使用我们流行的 .reduce() 方法和一个函数来比较这些值 。
比较器函数将当前字符串的长度与前一个最长字符串的长度进行比较,如果更长则返回当前字符串,否则返回前一个最长字符串 。
你可以这样做:
const arr = ['short', 'medium', 'long', 'longest'];const longest = arr.reduce((acc, x) => x.length > acc.length ? x : acc, '');console.log(longest); // 'longest'这种方法创建一个新变量(acc 或累加器)并且不修改原始数组 。
时间复杂度是线性的(意味着它对大型数组是有效的) 。
同样可以通过使用 sort() 方法和扩展运算符 (...) 来更简洁地找到数组中最长的字符串:
const longest = [...arr].sort((a, b) => b.length - a.length)[0];console.log(longest); // 'longest'


推荐阅读