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


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

文章插图
 
成为出色的问题解决者(这就是开发人员)没有捷径可走 。
精通是以练习为代价的 。由于算法和数据结构构成了每个软件的支柱,因此练习它们应该是您的首要任务 。作为最常用的存储值序列的数据结构,数组是必不可少的 。
今天,我们将通过学习如何来磨练我们的技能:
*展平一个数组
* 删除数组中的重复项
*从对象数组中删除重复项
*对对象数组进行排序
*合并两个数组
*返回两个数组之间的差异
*检查数组是否包含重复元素
*返回两个数组的交集
*查找数组中最长的字符串
俗话说“熟能生巧” 。让我们搞定它
如何展平数组:最简单的方法是使用内置的 .flat() 方法 。flat() 方法采用可选的最大深度参数 。
例如,给定以下数组:
const arr = [1, 2, [3, 4], [[5, 6], [7, 8]]];展平的代码是:
const flattened = arr.flat(2); //最大深度console.log(flattened); // [1, 2, 3, 4, 5, 6, 7, 8]【提升 JavaScript 水平的 9 个基本数组难题 [JS 基础]】flat() 方法返回一个新数组,所有子数组以递归方式连接到指定深度 。
您还可以创建自己的递归函数,迭代数组的元素并将它们添加到新数组中,一次一个 。
  • 如果一个元素是一个数组,该函数应该以该元素作为参数调用自身,然后将结果数组连接到新数组 。
  • 如果一个元素不是数组,函数应该简单地将它添加到新数组中 。
这是一个示例,说明如何编写递归函数来展平数组:
function flatten(arr) {let result = [];for (let i = 0; i < arr.length; i++) {if (Array.isArray(arr[i])) {result = result.concat(flatten(arr[i]));} else {result.push(arr[i]);}}return result;}const arr = [1, [2, [3, [4]]], 5];console.log(flatten(arr)); // [1, 2, 3, 4, 5]您可以使用 .reduce() 方法和三元运算符使此函数更加简洁 。
function flatten(arr) {return arr.reduce((accumulator, currentItem) =>Array.isArray(currentItem)? accumulator.concat(flatten(currentItem)): accumulator.concat(currentItem),[]);}此函数具有线性时间复杂度(这意味着它对大型数组很有效) 。它还具有恒定的空间复杂度(这意味着它不会随着数组大小的增加而占用更多内存) 。
如何从数组中删除重复项:到目前为止,删除数组重复项的最简单和更简洁的方法是使用 Set 对象 。
Set 对象仅存储唯一值,因此您可以从数组创建一个新集合,然后使用 Array.from() 方法将该集合转换回数组 。
这是您可以使用 Set 对象执行此操作的一种方法:
const arr = [1, 2, 3, 1, 2, 3, 4, 5];const unique = Array.from(new Set(arr));console.log(unique); // [1, 2, 3, 4, 5]您还可以使用我最喜爱的 .reduce()
const arr = [1, 2, 3, 1, 2, 3, 4, 5]arr.reduce((accumulator, currentItem) => {if (!accumulator.includes(currentItem))accumulator.push(currentItem)return accumulator},[])如何对对象数组进行排序要对对象数组进行排序,您必须从对象中选择一个属性来对数组进行排序 。
然后,您可以调用 .sort() 并将其传递给比较器函数 。
这是比较器函数的工作原理:
  • 需要两个参数
  • 如果第一个应该在第二个之前出现,则返回负值
  • 如果第一个应该在第二个之后,它返回一个正值
  • 如果值相等,则返回 0 。
以下是如何根据 name 属性的值对对象数组进行排序:
const arr = [{name: 'Bob', age: 30},{name: 'Alice', age: 25},{name: 'Charlie', age: 35}];arr.sort((a, b) => {if (a.name < b.name) { //你可以根据任意属性排序return -1;} else if (a.name > b.name) {return 1;} else {return 0;}});/*[{name: 'Alice', age: 25},{name: 'Bob', age: 30},{name: 'Charlie', age: 35}] */您还可以使用三元运算符来制作单行版本:
arr.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0);注意:有时嵌套的三元组可能难以阅读 。
请记住,sort() 方法会修改原始数组,因此如果您想保留原始数组,您应该先复制它 。
如何合并2个数组要合并两个数组,您可以使用 concat() 方法 。concat() 方法返回一个包含两个数组元素的新数组 。
以下是如何使用 concat() 合并两个数组的示例:
const arr1 = [1, 2, 3];const arr2 = [4, 5, 6];const merged = arr1.concat(arr2);console.log(merged); // [1, 2, 3, 4, 5, 6]


推荐阅读