目录
- 找出数组中重复的数字
- 方法一:使用 Set 数据结构
- 方法二:排序数组
- js中数组是如何在内存中存储的?
- 原生遍历数组的方式有哪些?
- 请对以下数组,根据 `born` 的值降序排列
找出数组中重复的数字
找出数组中的重复数字是一个常见的问题,下面提供两种不同的解决思路:
方法一:使用 Set 数据结构
function findDuplicate(nums) {const numSet = new Set()for (const num of nums) {if (numSet.has(num)) {return num // 返回重复的数字}numSet.add(num)}return null // 数组中没有重复数字
}const numbers = [2, 3, 1, 0, 2, 5, 3]
const duplicate = findDuplicate(numbers)
console.log(duplicate) // 输出 2
思路: 使用 Set 数据结构,遍历数组元素,将每个元素添加到 Set 中。如果当前元素已经在 Set 中存在,说明是重复数字,直接返回。这种方法具有良好的性能,并且可以适用于未排序数组。
方法二:排序数组
function findDuplicate(nums) {nums.sort((a, b) => a - b)for (let i = 1; i < nums.length; i++) {if (nums[i] === nums[i - 1]) {return nums[i] // 返回重复的数字}}return null // 数组中没有重复数字
}const numbers = [2, 3, 1, 0, 2, 5, 3]
const duplicate = findDuplicate(numbers)
console.log(duplicate) // 输出 2
思路: 将数组排序,然后遍历数组查找相邻元素是否相同。如果找到相同的元素,直接返回。这种方法简单直观,但改变了原始数组的顺序。
你可以根据需求选择合适的方法。这两种方法在不同情境下都能有效地找出数组中的重复数字。
js中数组是如何在内存中存储的?
在JavaScript中,数组的内存存储是通过对象来实现的。通俗地说,JavaScript中的数组实际上是一种特殊类型的对象。下面是详细的说明、效果和思路:
说明:
在JavaScript中,数组是一种特殊的对象,其元素通过索引进行访问。与普通对象不同的是,数组有一些额外的功能,比如length
属性,以及一些内置的数组方法(如push
、pop
、shift
、unshift
等)。
效果:
// 创建一个数组
const myArray = [10, 20, 30, 40]// 访问数组元素
console.log(myArray[0]) // 输出: 10// 使用数组方法
myArray.push(50) // 在数组末尾添加元素console.log(myArray) // 输出: [10, 20, 30, 40, 50]
思路:
- 索引访问: 数组元素通过索引进行访问,每个元素在内存中有一个与其对应的索引。
- length属性: 数组对象有一个
length
属性,表示数组的长度。当你添加或删除元素时,length
会自动更新。 - 额外的功能: 数组对象还具有一些额外的功能,如
push
用于在数组末尾添加元素,pop
用于删除并返回数组的最后一个元素等。
总体而言,JavaScript中的数组是一种灵活而动态的数据结构,其内存存储采用对象的形式,通过索引进行元素的访问。
原生遍历数组的方式有哪些?
遍历数组的方式有多种,下面是一些参考:
- for循环:
说明: 使用for
关键字进行循环,通过索引遍历数组。
效果:
let arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {console.log(arr[i])
}
思路: 通过控制循环变量i
的值,访问数组中的每个元素。
- for循环优化:
说明: 在for
循环中,通过将数组的长度缓存到一个变量,可以提高性能。
效果:
for (let i = 0, len = arr.length; i < len; i++) {console.log(arr[i])
}
思路: 将数组的长度缓存,避免在每次循环时都计算数组的长度。
- forEach方法:
说明: 使用数组的forEach
方法,接受一个回调函数,对数组中的每个元素进行操作。
效果:
arr.forEach(item => {console.log(item)
});
思路: 通过传入的回调函数,对数组中的每个元素进行操作。
- for…in循环:
说明: 使用for...in
语法,循环遍历对象的键。
效果:
for (let key in arr) {console.log(arr[key])
}
思路: 遍历对象的键,不建议用于遍历数组,因为性能相对较低。
- for…of循环:
说明: 使用for...of
语法,用于遍历可迭代对象(例如数组、字符串等)的值。
效果:
for (let value of arr) {console.log(value)
}
思路: 直接遍历数组中的值,性能较好,推荐用于遍历数组。
在以上示例中,手动测试的结果也印证了数组遍历的性能,其中for
循环是性能最好的方式,而for...in
相对较慢,不建议用于遍历数组。推荐使用for
循环或for...of
循环来遍历数组,具体选择取决于需求和性能要求。
请对以下数组,根据 born
的值降序排列
假设有一个包含对象的数组,每个对象都有一个 born
属性表示出生年份,现在需要根据这个属性的值降序排列数组。下面是一个通俗易懂的说明、效果和思路:
// 原始数组
const people = [{ name: 'Alice', born: 1980 },{ name: 'Bob', born: 1975 },{ name: 'Charlie', born: 1990 },{ name: 'David', born: 1985 }
]// 根据 born 属性降序排列
people.sort((a, b) => b.born - a.born)// 排序后的数组
console.log(people)
说明: sort
方法是 JavaScript 数组的内置方法,用于对数组元素进行排序。接受一个比较函数作为参数,该函数定义了排序的规则。
思路: 在比较函数中,通过 b.born - a.born
实现降序排列。如果结果为正数,则 b
在前;如果结果为负数,则 a
在前;如果结果为零,则它们相等,顺序不变。
效果: 排序后的数组将根据 born
属性的值降序排列,即从出生年份较晚的人到较早的人。在上述示例中,排序后的数组将按照出生年份降序排列。
根据具体情况和需求,你可以使用这种方法对包含对象的数组进行降序排列。
持续学习总结记录中,回顾一下上面的内容:
找出数组中重复的数字、js中数组是如何在内存中存储的?原生遍历数组的方式有哪些?请对以下数组,根据born
的值降序排列