数组
1.数组: 存放一些数据的集合,也是引用数据类型(复杂数据类型) 数组/对象/函数 2. 数组和对象将来如何选择? 1. 示例: - 商品的详情存放到某一个对象中, 比如: 商品名, 商品价格, 商品折扣, 商品描述.... - 商品列表假设有 100个商品, 那么你就有100个商品详情, 按照上述的封装那么你有100个对象 - 我们可以将 这 100个 对象, 存放到某一个数组中, 进行维护管理
创建数组
- 字面量的方式创建
- 内置构造函数的方式创建
- 数组内部是存放一些数据的,数据的类型没有限制
- 但是在开发的时候一般需要将一个数组内数据类型限制为一个 比如: 纯字符串数组,纯数字数组,纯对象数组
1.字面量的方式创建(使用场景最多的方式)
// var arr1=[]
//console.log(arr1)
var arr1=[true,undefined,null,999,578,'QF999']
console.log(arr1)
- 内置构造函数的方式创建
var arr2 =new Array()
console.log(arr3)
2.1 创建一个有长度的数组
var arr3= new Array(5)
console.log(arr3)
2.2 创建一个有内容的数组
var arr4 = new Array(500, 100, 200, 300, 'QF001', 'QF666')
console.log(arr4)
数组的长度
数组的长度并固定, 取决于数组内部有多少个元素
- 查看方式:
- 打印数据,在控制台展开数组,找到最后的length
- 打印 数组名.length
- 当数组的长度===0 代表当前数组为空数组
var arr=[1,2,3,4,5]
console.log(arr)
console.log(arr.length)
数组的索引(下标)
- 有什么用?
- 表明数组的这个位置有什么内容
- 下标是固定的,永远是 0 1 2 3 4 5...
- 但是下标对应的内容,不是固定的
var arr =[1,2,3,4,5]
//下标: 0 1 2 3 4
console.log('原数组:',arr)
// console.log(arr[0]) // 会得到当前数组下标0这个位置上的值 1
// console.log(arr[3]) // 会得到当前数组下标0这个位置上的值 4
// 通过数组的下标, 我们也可以修改数组中某一个元素的内容
arr[2] = '新的数据'
console.log('修改后的数组: ', arr)
// var arr1 = [100, 200, 'QF004', true]
// var arr2 = [5, 4, 3, 2, 1]
// console.log(arr1)
// console.log(arr2)
数据遍历
需求:拿到数组各个位置上的值
var arr=[1, 2, 3 ,4, 5, 6, 7, 8, 9, 10, 1, 2]
//下标 0 1 2 3 4 5 6 7 8 9 10 11
//console.log(arr[0])
//console.log(arr[1])
//console.log(arr[2])
//for (var i=0;i<=arr.length-1;){
for (var i=0;i<arr.length;i++){
//console.log(i)
console.log(arr[i])
}
JS案例
1. 找出数组中的最大值
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var max = arr[0]
console.log(arr)
for (var i = 0; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i]
}
} console.log(max)
2.找出数组中所有内容相加的和
var arr = [1, 2, 3, 4, 5]
console.log[arr]
var sum = 0
for (var i = arr.length - 1; i >= 0; i--) {
sum = sum + arr[i]
} console.log(sum)
3.封装一个函数,名为includes
功能为传入一个数组和数字,判断这个数组中是否包含这个数字
包含返回true,否则返回false
function includes(a, b) {
for (var i = 0; i < arr.length; i++) {
if (b === arr[i]) {
return true
}
}
return false
}
var arr = [1, 2, 3, 4, 5]
console.log(includes(arr, 6))
4. 封装一个函数,名为 indexof功能为 传入一个数组和数字,判断这个数组中是否包含这个数字包含返回 这个数字的下标(从左到右第一个)否则返回-1
function indexof(a, b) {
for (var i = 0; i < arr.length; i++) {
if (b === arr[i]) {
return i
}
} return -1
}
var arr = [1, 2, 3, 4,]
console.log(indexof(arr, 4))
5.封装一个函数,名为 lastIndexof功能为 传入一个数组和数字,判断这个数组中是否包含这个数字包含返回 这个数字的下标(从右到左第一个)否则返回-1
function lastIndexof(a, b) {
for (var i = arr.length - 1; i >= 0; i--) {
if (b === arr[i]) {
return i
}
} return -1
}
var arr = [1, 2, 3, 4, 2, 2, 2]
console.log(lastIndexof(arr, 2))
冒泡排序
算法/设计模式 这两个不是一个东西, 但是都是为了解决某一类问题的最佳解法
//冒泡排序(基础班,没有优化)
for(var j=0;j<arr.length;j++){
for(var i=0;i<arr.length;i++){
if(arr[i]>arr[i+1]){
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
console.log('第 ', j + 1, ' 轮冒泡排序后: ', arr)
// 1. 数组的前后两项交换 ([0] 和 [1])
// var temp = arr[0] // [0] 拥有了备份
// arr[0] = arr[1] // 将 [1] 的值 放在了 [0] 的位置上
// arr[1] = temp // 将 原本 [0] 的值, 放在了 [1] 的位置上
// console.log(arr)
/**
* 因为要做前后两项的对比, 所以我们需要先拿到数组的所有元素, 所以写了一个 for 循环
*
* 在 循环内部 判断, 如果 前一项比后一项的值要大, 那么将前后两项交换位置
*/
// for (var i = 0; i < arr.length; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i] // 存储当前项的值
// arr[i] = arr[i + 1] // 将后一项的值 放在前一项的位置上
// arr[i + 1] = temp // 将原本 前一项(当前项) 的值, 放在 后一项 的位置上
// }
// }
// console.log('第 1 轮冒泡排序后: ', arr)
// for (var i = 0; i < arr.length; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('第 2 轮冒泡排序后: ', arr)
// for (var i = 0; i < arr.length; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('第 3 轮冒泡排序后: ', arr)
// for (var i = 0; i < arr.length; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('第 4 轮冒泡排序后: ', arr)
// for (var i = 0; i < arr.length; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('第 5 轮冒泡排序后: ', arr)
// for (var i = 0; i < arr.length; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('第 6 轮冒泡排序后: ', arr)
// for (var i = 0; i < arr.length; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('第 7 轮冒泡排序后: ', arr)
// for (var i = 0; i < arr.length; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('第 8 轮冒泡排序后: ', arr)
// for (var i = 0; i < arr.length; i++) {
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// console.log('第 9 轮冒泡排序后: ', arr)
冒泡排序优化
优化3,去掉多余的无用对比
for (var j = 0; j < arr.length - 1; j++) {
// console.log('当前是第 ', j + 1, ' 次循环, 此时变量 j ===', j)
for (var i = 0; i < arr.length - 1 - j; i++) {
// console.log('此时对比的是: ', arr[i], arr[i + 1])
if (arr[i] > arr[i + 1]) {
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
}
console.log( arr)
// for (var j = 0; j < arr.length - 1; j++) {
// for (var i = 0; i < arr.length - 1; i++) {
// /**
// * 当前 数组 arr.length === 9
// *
// * 那也就是说 i 最大 为 8
// *
// * 所以最后一轮循环 i === 8
// *
// * 判断的内容为 arr[i] > arr[i + 1]
// * arr[8] > arr[9]
// *
// * 所以最后一次 判断没有意义, 所以我们此时应该让 内层循环 - 1
// */
// if (arr[i] > arr[i + 1]) {
// var temp = arr[i]
// arr[i] = arr[i + 1]
// arr[i + 1] = temp
// }
// }
// }
// console.log('冒泡排序后: ', arr)
优化 1: 外层循环可以减少一次
* 一共 9 个数字, 所以需要执行 9 次 冒泡
*
* 但是前 8 次执行完毕后, 就剩下一个位置和一个数字 没有验证了
*
* 所以没必要执行最后一次了, 因为没有多的位置
*/
for (var j = 0; j < arr.length - 1; j++) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] > arr[i + 1]) {
var temp = arr[i]
arr[i] = arr[i + 1]
arr[i + 1] = temp
}
}
}
console.log('冒泡排序后: ', arr)
选择排序
var arr = [9, 3, 6, 2, 4, 1, 8, 5, 7]
// 0 1 2 3 4 5 6 7 8
第几次循环 假设谁是最小值 和谁交换 内层循环从 ? 开始
k === 0 1 0 0 1
k === 1 2 1 1 2
k === 2 3 2 2 3
for (var k = 0; k < arr.length; k++) {
// 1. 假设 k 是最小值的下标, 保存在 minIndex
var minIndex = k
// 2. 循环会帮我们找到真实最小值的下标, 并保存在变量 minIndex
for (var i = k + 1; i < arr.length; i++) {
if (arr[minIndex] > arr[i]) {
minIndex = i
}
}
// 3. 交换 真实最小值(下标 minIndex) 和 假设最小值 (k) 的位置
var temp = arr[k]
arr[k] = arr[minIndex]
arr[minIndex] = temp
}
console.log('排序后: ', arr)