數組是一組無序的集合,每個元素之間使用逗號隔開,可以存放任何類型的數據
一, 定義
1、使用字面量的方式
var arr = [1,3,,4,5];
2、使用構造函數
var arr = new Array();
var arr = new Array(4); // 4 數組長度
給數組獲取元素和添加元素
因為數組有長度和下標,獲取元素和存放元素,使用下標
var arr = new Array();
arr[0] = 1;
arr[100] = 100;
console.log(arr[99]); //undefined
console.log(arr.length);
使用數組薰染數據
ar arr = ['標題一','標題二','標題三']
var ul = document.getElementsByTagName('ul')[0];
ul.innerHTML = '<li>'+arr[0]+'</li>'
數組的遍歷
使用for循環,在數組的長度方位之內,循環下標
var arr = [1,2,3,4,5,6,9];
// 數組遍歷
for(var i=0; i<arr.length;i++){
console.log(arr[i]);
console.log(typeof i); // number
}
// 需求:循環1-100個數 放到數組裏面
var arr = []
for (var i = 1; i <= 100; i++) {
arr[i - 1] = i;
}
console.log(arr);
數組渲染數據改版
// 渲染數據
var arr = ['禁令下仍暗中公款吃喝 開票不打包大魚大肉一筷未動', '專家:印度人自封“世界第二強國” 我們該害怕嗎?', '特朗普將紐約等3地列為"無政府地區" 允許暴力犯罪?']
// 1、使用下標
// 2、給頁面輸送內容 標籤.innerHTML +=
for (var i = 0; i < arr.length; i++) {
// document.body.innerHTML += arr[i] + '<br />';
document.body.innerHTML += '<h2>'+arr[i]+'</h2>';
}
// 獲取body標籤
// document.getElementsByTagName('body')[0];
// document.body
for-in 循環對象
語法:
for(var key in obj){
// key:循環的是對象的屬性名
}
// 對象
var obj = {
name: '張三',
age: 20,
sex: '男'
}
for(var key in obj){ // key = 'name' key = 'sex'
// console.log(key);
// 當屬性名賦值給一個變量的時候,就需要把.的方式改成中括號的方式操作屬性
console.log(obj[key]);
// console.log(obj['name']);
}
注意:
1、在循環數組的時候,最好是使用for循環,一般使用for-in循環數組
2、因為使用for-in循環數組,拿到的下標是一個string for循環拿到的下標是number
var arr = [1,2,3,4]
for(var i in arr){
console.log(typeof i); // string
}
// for循環
for(var i=0;i<arr.length;i++){
console.log(typeof i); // number
}
二, 數組的操作方法
1, 棧方法
數組的棧方法是在針對數組的末尾進行的操作,在數組的末尾可以添加元素或者刪除元素
添加元素
語法:數組.push()
是在數組的末尾給數組添加元素,可以有參數,參數就是給數組添加的元素,返回的是新數組的長度
var arr = ['劉備','張飛','劉老師'];
// 沒有參數
// var arr1 = arr.push();
// var arr2 = arr.push('二皇子');
var arr3 = arr.push('二皇子','趙子龍','龍龍')
console.log(arr3);
console.log(arr);
刪除元素
語法:數組.pop()
在數組的末尾刪除一個元素,沒有參數的,每一次只能刪除一個,返回的是被刪除的元素
var arr4 = arr.pop();
console.log(arr4);
console.log(arr);
2, 隊列方法
數組的隊列方法是針對數組的頭部進行的操作,可以在數組的頭部添加或者刪除元素
添加元素
語法:數組.unshift()
返回的是新的數組的長度,可以含有多個參數,參數的個數,就是添加元素的個數
var data = ['張大媽','王大爺','劉海柱']
var data1 = data.unshift();
var data2 = data.unshift('帥帥')
var data3 = data.unshift('帥帥','騙人的')
console.log(data2);
console.log(data);
刪除元素
語法:數組.shift()
沒有參數,返回的是被刪除的元素 ,一次只能刪除一個
var data4 = data.shift();
console.log(data4);
console.log(data);
三, splice
這個方法是針對數組的操作,可以刪除一段連續的元素或者添加替換一段連續的元素
語法:數組.splice(起始位置,刪除的項數,替換的元素)
返回值也會返回被刪除的元素,但是,是以數組的形式返回被刪除的元素
1, 刪除
使用刪除的時候,有兩個參數,數組.splice(起始位置,刪除的項數)
var data = ['張大媽', '王大爺', '劉海柱','趙四','劉能','翠花']
var data1 = data.splice(1,2);
console.log(data1);
console.log(data);
2, 添加
在添加元素的時候,刪除項為 0 ,添加的元素可以有多個
語法:數組.splice(起始位置,0,添加的元素)
var data2 = data.splice(1,0,'張大爺','劉大爺','打野');
console.log(data2);
console.log(data);
3, 替換
var data2 = data.splice(1,2,'張大爺','劉大爺','打野');
console.log(data2);
console.log(data);
四, 數組去重
var arr = [3, 1, 8, 3, 4, 6, 9, 2, 3, 9, 6, 4, 5, 7, 6, 1, 4];
// 原理:先取第一個元素,然後從第二個元素開始,把後面的元素依次取出來
// 和第一個元素做比較,如果不相等,放到數組裏面,如果相等,刪除
// 刪除一個元素後,數組的下標是要變化的
for (var i = 0; i < arr.length; i++) { // 控制比較的輪數
for (var j = i + 1; j < arr.length; j++) {
if(arr[i] == arr[j]){
arr.splice(j,1);
j--;
}
}
}
console.log(arr);
// 第二種
// 聲明一個空數組,把原來數組的元素取出來,在新數組裏面查找,有沒有這個元素
// 如果沒有,放進去,如果有,就不添加
var arr = [3, 1, 8, 3, 4, 6, 9, 2, 3, 9, 6, 4, 5, 7, 6, 1, 4];
var newArray = [];
for (var i = 0; i < arr.length; i++) {
if(newArray.indexOf(arr[i]) === -1){
newArray.push(arr[i]);
}
}
console.log(newArray);
五, 數組方法
數組.indexOf(查找的元素,起始位置)
var arr = [3, 1, 8, 2, 3, 4, 6, 9, 2, 3, 9, 6, 4, 5, 7, 6, 1, 4];
console.log(arr.indexOf(3, 2));
六, 合併數組
// 合併數組
// 語法:數組.concat(合併的數組) 不改變原來的數組
var arr1 = ['劉備'];
var arr2 = ['張飛'];
var arr3 = ['關羽'];
var arr = arr1.concat(arr2,arr3);
// console.log(arr);
console.log(arr1.concat(arr2,arr3));
console.log(arr1,arr2,arr3);
七, 翻轉數組
語法:數組.reverse()
console.log(arr.reverse());
八, 截取數組
語法:數組.slice(起始位置,結束位置)
var arr6 = [3, 1, 8, 4, 5, 6, 7];
// 沒有參數的時候,相當於克隆(複製)數組
console.log(arr6.slice());
// 當一個參數的時候,從當前位置切割刀末尾
console.log(arr6.slice(1));
// 當兩個參數的時候,包含開始 但不包含結束
console.log(arr6.slice(1,4));
九, 遞歸函數
一個函數直接或者間接的調用自己,這種函數就是遞歸函數
function num(n) {
return num(n - 1);
}
console.log(num(10));
步驟:
1、假設這個問題已經解決,也就是遞歸函數已經存在
2、找遞推關係(關係體)
3、把遞推關係轉換成遞歸體(代碼塊)
4、加入臨界條件
需求:求 1- 100的和
// 1、假設函數已經寫完
function num(n) {
num(n)
}
// 2、找遞推關係
num(100)
num(100 - 1) + 100
num(n)
num(n - 1) + n
// 3、把遞推關係轉換成遞歸體
function num(n) {
num(n - 1) + n
}
// 4、加入臨界條件 (結束條件)
if (n == 1) return 1;
// 計算
function num(n) {
if (n == 1) return 1;
return num(n - 1) + n;
}
console.log(num(100));
十, 數組排序
1、數組.sort()
// 數組.sort(); 默認是從小到大
var arr1 = arr.sort();
// 升序排列
console.log(arr1);
// 降序排列(翻轉)
console.log(arr1.reverse());
2、排序
語法:數組.sort(參數)
參數:函數 這個函數接受兩個形參 這兩個形參做一個減法運算
如果第一個參數減去第二個參數 如果是大於0的 第一個參數大 返回值是 1
如果第一個參數減去第二個參數 如果是小於0的 第二個參數大 返回值是 -1
如果第一個參數減去第二個參數 如果是等於0的 相等 返回值 0
// 基本用法
arr.sort(function (a, b) {
// return a - b; // 升序
return b - a; // 降序
})
// 底層實現
arr.sort(function (a, b) {
if (a > b) {
return 1
} else if (a < b) {
return -1
} else {
return 0
}
return a - b;
})
十一, 中文排序
var arr = [
{ name: '劉備', num: 90 },
{ name: '溜溜', num: 80 },
{ name: '二備', num: 70 },
{ name: '三備', num: 60 },
{ name: '四備', num: 50 },
{ name: '五備', num: 40 }
]
// 按照姓名排序
// console.log(arr[0].name);
arr.sort(function(a,b){ // a = { name: '劉備', num: 90 }
// 排序
// zh:告訴這個sort我要使用中文排序了
// localeCompare:拿到第一個中文漢語拼音的首字母
return a.name.localeCompare(b.name,'zh');
// 按照武力值排序 升序
return a.num - b.num;
// 按照武力值排序 降序
return b.num - a.num;
})
// 當漢語拼音一樣 按照聲調排序
十二, 選擇排序
選擇排序就是拿第一個元素和後面的元素依次比對,如果前一個比後一個小,不交換位置,反之,交換位置。
for (var i = 0; i < arr.length; i++) { // i = 0 === 9
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
var num = arr[i];
arr[i] = arr[j]
arr[j] = num;
}
}
}
十三, 冒泡排序
冒泡排序就是相鄰的兩個元素依次比較,前一個大的交換位置,反之,不交換位置
特點:第一輪結束後,最大數一定在最右邊,每一次都會少比較一次
for (var i = 0; i < arr.length; i++) { // 控制比較的次數
for(var j = 0; j<arr.length;j++){
if(arr[j] > arr[j + 1]){
var num = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = num;
}
}
}
十四, 快速排序
在給定一個數組的情況下,通過使用數組的中間下標值,確定中間值,循環數組,把元素取出來和中間值依次比對,如果比中間值小,放到左邊的數組,如果比中間值大,放到右邊的數組,最後,使用遞歸函數的原理,重複上述的動作
// 我要使用快速排序了 你一邊去吧
var arr = [15, 12, 3, 2, 7];
function fn(arr) {
// 先判斷數組的長度,如果長度小於等於1 不需要排序
if (arr.length <= 1) {
return arr;
}
// 找中間值
var md = Math.floor(arr.length / 2);
// 把這個中間值使用splice在原數組中刪除
var num = arr.splice(md, 1)[0]; // [3]
// 聲明左數組和右數組
var left = [];
var right = [];
// 循環原來的數組
for (var i = 0; i < arr.length; i++) {
if (arr[i] < num) {
left.push(arr[i])
} else if (arr[i] > num) {
right.push(arr[i])
}
}
// 使用遞歸重複上述的操作
return fn(left).concat(num, fn(right));
}
console.log(fn(arr)); //