學(xué)習(xí)Javascript數(shù)據(jù)結(jié)構(gòu)與算法(第2版)筆記(2)

第 2 章 數(shù)組

1. 創(chuàng)建和初始化數(shù)組

var arr = new Array();
var arr = new Array(7);
var arr = new Array('aa','bb');
或:
var arr = [];
var arr = ['aa','bb'];

arr.length  //數(shù)組長(zhǎng)度

訪問元素和迭代數(shù)組

for(var i=0;i<arr.length;i++){
    console.log(arr[i]);
}

2. 添加元素

var arr = [1,2,3];
arr[arr.length] = 4;

2.1 使用 push 方法(添加到數(shù)組末尾)

arr.push(5);
arr.push(6,7);

2.2 使用 unshift 方法(插入元素到數(shù)組首位)

arr.unshift(0);
arr.unshift(-2,-1);

原理:
for (var i=arr.length; i>=0; i--){
    arr[i] = arr[i-1];
}
arr[0] = 0;

3. 刪除元素

3.1 使用 pop 方法(刪除數(shù)組里最靠后的元素)

arr.pop();

3.2 使用 shift 方法(從數(shù)組首位刪除元素)

arr.shift();
原理:
for (var i = 0; i < arr.length; i++){
    arr[i] = arr[i+1];
}

4. 在任意位置添加或刪除元素

使用 splice 方法(通過指定位置/索引添加或刪除相應(yīng)位置和數(shù)量的元素)

arr.splice(1,2); // 從數(shù)組索引1開始刪除2個(gè)元素
arr.splice(1,0,7,8,9); // 從數(shù)組索引1開始添加3個(gè)元素
arr.splice(1,2,7,8,9);//從數(shù)組索引1開始刪除2個(gè)元素,并從索引1開始添加3個(gè)元素

5. 二維和多維數(shù)組

function printArr(matrix){
    for(var i=0;i<matrix.length;i++){
        for(var j=0;j<matrix[i].length;j++){
            console.log(matrix[i][j])
        }
    }
}

3×3×3:
for (var i=0; i<arr.length; i++){
    for (var j=0; j<arr[i].length; j++){
        for (var z=0; z<arr[i][j].length; z++){
            console.log(arr[i][j][z]);
        }
    }
}

6. Javascript 數(shù)組方法參考

方法名 描述
concat 連接2個(gè)或更多數(shù)組假消,并返回結(jié)果
every 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回 true 撞蚕,則返回 true
filter 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)扬虚,返回該函數(shù)會(huì)返回 true 的項(xiàng)組成的數(shù)組
forEach 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)串前。這個(gè)方法沒有返回值
join 將所有的數(shù)組元素連接成一個(gè)字符串
indexOf 返回第一個(gè)與給定參數(shù)相等的數(shù)組元素的索引熊杨,沒有找到則返回-1
lastIndexOf 返回在數(shù)組中搜索到的與給定參數(shù)相等的元素的索引里最大的值
map 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)费韭,返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組
reverse 顛倒數(shù)組中元素的順序依沮,原先第一個(gè)元素現(xiàn)在變成最后一個(gè)涯贞,同樣原先的最后一個(gè)元素變成了現(xiàn)在的第一個(gè)
slice 傳入索引值,將數(shù)組里對(duì)應(yīng)索引范圍內(nèi)的元素作為新數(shù)組返回
some 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù)危喉,如果任一項(xiàng)返回 true 宋渔,則返回 true
sort 按照字母順序?qū)?shù)組排序,支持傳入指定排序方法的函數(shù)作為參數(shù)
toString 將數(shù)組作為字符串返回
valueOf 和 toString 類似辜限,將數(shù)組作為字符串返回
6.1 數(shù)組合并 (concat)
var num = 0;
var arr1 = [1,2,3];
var arr2 = [-3,-2,-1];
var nums = arr2.concat(num,arr2);//[-3,-2,-1,0,1,2,3]
6.2 迭代器函數(shù)
var isEven = function(x){
    console.log(x)
    return (x % 2 == 0);
};
var nums = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

1. 用 every 方法迭代( every 方法會(huì)迭代數(shù)組中的每個(gè)元素皇拣,直到返回 false )
nums.every(isEven); //1

2. 用 some 方法迭代( some 方法會(huì)迭代數(shù)組的每個(gè)元素,直到函數(shù)返回 true)
nums.some(isEven);//1,2

3. 用 forEach 方法迭代(迭代整個(gè)數(shù)組薄嫡,與for循環(huán)相同)
nums.forEach(isEven);

4. 使用 map 和 filter 方法
var myMap = nums.map(isEven);// [false, true, false, true, false, true, false, true,false, true, false, true, false, true, false]

var myFilter = nums.filter(isEven);//[2, 4, 6, 8, 10, 12, 14]

5. 使用 reduce 方法
nums.reduce(function(preVal,currVal,index,arr){
    return preVal + currVal;
});//120
6.3 ECMAScript 6 和數(shù)組的新功能
方 法 描 述
@@iterator 返回一個(gè)包含數(shù)組鍵值對(duì)的迭代器對(duì)象氧急,可以通過同步調(diào)用得到數(shù)組元素的鍵值對(duì)
copyWithin 復(fù)制數(shù)組中一系列元素到同一數(shù)組指定的起始位置
entries 返回包含數(shù)組所有鍵值對(duì)的 @@iterator
includes 如果數(shù)組中存在某個(gè)元素則返回 true ,否則返回 false 岂座。ES7新增
find 根據(jù)回調(diào)函數(shù)給定的條件從數(shù)組中查找元素态蒂,如果找到則返回該元素
findIndex 根據(jù)回調(diào)函數(shù)給定的條件從數(shù)組中查找元素,如果找到則返回該元素在數(shù)組中的索引
fill 用靜態(tài)值填充數(shù)組
from 根據(jù)已有數(shù)組創(chuàng)建一個(gè)新數(shù)組
keys 返回包含數(shù)組所有索引的 @@iterator
of 根據(jù)傳入的參數(shù)創(chuàng)建一個(gè)新數(shù)組
values 返回包含數(shù)組中所有值的 @@iterator

ES6和ES7新增的數(shù)組方法费什。

方 法 描 述
@@iterator 返回一個(gè)包含數(shù)組鍵值對(duì)的迭代器對(duì)象钾恢,可以通過同步調(diào)用得到數(shù)組元素的鍵值對(duì)
copyWithin 復(fù)制數(shù)組中一系列元素到同一數(shù)組指定的起始位置
entries 返回包含數(shù)組所有鍵值對(duì)的 @@iterator
includes 如果數(shù)組中存在某個(gè)元素則返回 true 手素,否則返回 false 。ES7新增
find 根據(jù)回調(diào)函數(shù)給定的條件從數(shù)組中查找元素瘩蚪,如果找到則返回該元素
findIndex 根據(jù)回調(diào)函數(shù)給定的條件從數(shù)組中查找元素泉懦,如果找到則返回該元素在數(shù)組中的索引
fill 用靜態(tài)值填充數(shù)組
from 根據(jù)已有數(shù)組創(chuàng)建一個(gè)新數(shù)組
keys 返回包含數(shù)組所有索引的 @@iterator
of 根據(jù)傳入的參數(shù)創(chuàng)建一個(gè)新數(shù)組
values 返回包含數(shù)組中所有值的 @@iterator
6.3.1 使用 forEach 和箭頭函數(shù)迭
nums.forEach(function(x){
   console.log(x%2==0); 
});

num.forEach(x => {console.log(x%2==0)})
6.3.2 使用 for...of 循環(huán)迭代
for(let n of nums){ //n 代表數(shù)組中每一項(xiàng)
    console.log((n%2==0)?'even':'odd');
}
6.3.3 使用ES6新的迭代器( @@iterator )

ES6還為 Array 類增加了一個(gè) @@iterator 屬性,需要通過 Symbol.iterator 來訪問疹瘦。

let iterator = nums[Symbol.iterator]();
console.log(iterator.next().value); // 1
console.log(iterator.next().value); // 2
console.log(iterator.next().value); // 3
console.log(iterator.next().value); // 4
console.log(iterator.next().value); // 5

數(shù)組的 entries 崩哩、 keys 和 values 方法

1. entries 方法返回包含鍵值對(duì)的 @@iterator 
let aEntries = nums.entries(); // 得到鍵值對(duì)的迭代器
console.log(aEntries.next().value); // [0, 1] - 位置0的值為1
console.log(aEntries.next().value); // [1, 2] - 位置1的值為2
console.log(aEntries.next().value); // [2, 3] - 位置2的值為3

2. keys 方法返回包含數(shù)組索引的 @@iterator
let aKeys = nums.keys(); // 得到數(shù)組索引的迭代器
console.log(aKeys.next()); // {value: 0, done: false }
console.log(aKeys.next()); // {value: 1, done: false }
console.log(aKeys.next()); // {value: 2, done: false }

3. values 方法返回的 @@iterator 則包含數(shù)組的值
let aValues = nums.values();
console.log(aValues.next()); // {value: 1, done: false }
console.log(aValues.next()); // {value: 2, done: false }
console.log(aValues.next()); // {value: 3, done: false }
6.3.4 使用 from 方法(根據(jù)已有的數(shù)組創(chuàng)建一個(gè)新數(shù)組)
let nums2 = Array.from(nums);

let evens = Array.from(nums,x => {x%2==0});
6.3.5 使用 Array.of 方法(根據(jù)傳入的參數(shù)創(chuàng)建一個(gè)新數(shù)組)
let num3 = Array.of(1);
let num4 = Array.of(1, 2, 3, 4, 5, 6);
等價(jià)于:
let num3 = [1];
let num4 = [1, 2, 3, 4, 5, 6];

復(fù)制已有數(shù)組:
let numCopy = Array.of(...num4);
6.3.6 使用 fill 方法(用靜態(tài)值填充數(shù)組。參數(shù):填充數(shù)言沐、開始索引邓嘹、結(jié)束索引)
let numCopy = Array.of(1, 2, 3, 4, 5, 6);

numCopy.fill(0); // [0,0,0,0,0,0]
numCopy.fill(2, 1); // [0,2,2,2,2,2]
numCopy.fill(1, 3, 5); // [0,2,2,1,1,2]
let ones = Array(6).fill(1);// [1,1,1,1,1,1]
6.3.7 使用 copyWithin 方法(復(fù)制數(shù)組中的一系列元素到同一數(shù)組指定的起始位置)
let copyArray = [1, 2, 3, 4, 5, 6];
copyArray.copyWithin(0, 3); // [4, 5, 6, 4, 5, 6]

copyArray = [1, 2, 3, 4, 5, 6];
copyArray.copyWithin(1, 3, 5);// [1, 4, 5, 4, 5, 6]
6.4 排序元素
nums = [1,2,3,4,5,6,7,8,9,10]
nums.reverse();//[10,9,8,7,6,5,4,3,2,1]
nums.sort(function(a, b){
    return a-b;
});
等價(jià)于:
function compare(a, b) {
    if (a < b) {
        return -1;
    }
    if (a > b) {
        return 1;
    }
    return 0;
}
nums.sort(compare);
6.4.1 自定義排序
var friends = [
    {name:'張三',age:18},
    {name:'李四',age:25},
    {name:'王五',age:21}
]
function comparePerson(a, b){
    if (a.age < b.age){
        return -1
    }
    if (a.age > b.age){
        return 1
    }
    return 0;
}
console.log(friends.sort(comparePerson));//從小到大
6.4.2 字符串排序
var names =['Ana', 'ana', 'john', 'John'];
names.sort(function(a, b){
    if (a.toLowerCase() < b.toLowerCase()){
        return -1
    }
    if (a.toLowerCase() > b.toLowerCase()){
        return 1
    }
    return 0;
});

對(duì)帶有重音符號(hào)的字符做排序
var names2 = ['Maève', 'Maeve'];
console.log(names2.sort(function(a, b){
    return a.localCompare(b);
}));
6.5 搜索

indexOf 方法返回與參數(shù)匹配的第一個(gè)元素的索引, lastIndexOf 返回
與參數(shù)匹配的最后一個(gè)元素的索引

6.5.1 ECMAScript 6—— find 和 findIndex 方法
let nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
function multipleOf13(element, index, array) {
    return (element % 13 == 0) ? true : false;
}
console.log(nums.find(multipleOf13)); //找到返回13险胰,找不到返回undefined
console.log(nums.findIndex(multipleOf13)); //找到返回索引汹押,找不到返回-1
6.5.2 ECMAScript 7——使用 includes 方法
數(shù)組里存在某個(gè)元素, includes 方法會(huì)返回 true 起便,否則返回 false 棚贾。
console.log(nums.includes(15));
console.log(nums.includes(20));

let nums2 = [7, 6, 5, 4, 3, 2, 1];
console.log(nums2.includes(4, 5));//從索引5開始查找
6.6 輸出數(shù)組為字符串
把數(shù)組里所有元素輸出為一個(gè)字符串,可以用 toString 方法
console.log(nums.toString());

用一個(gè)不同的分隔符(比如 - )把元素隔開榆综,可以用 join 方法
var numsString = nums.join('-');
console.log(numsString);
6.7 類型數(shù)組
類型數(shù)組 數(shù)據(jù)類型
Int8Array 8位二進(jìn)制補(bǔ)碼整數(shù)
Uint8Array 8位無符號(hào)整數(shù)
Uint8ClampedArray 8位無符號(hào)整數(shù)
Int16Array 16位二進(jìn)制補(bǔ)碼整數(shù)
Uint16Array 16位無符號(hào)整數(shù)
Int32Array 32位二進(jìn)制補(bǔ)碼整數(shù)
Uint32Array 32位無符號(hào)整數(shù)
Float32Array 32位IEEE浮點(diǎn)數(shù)
Float64Array 64位IEEE浮點(diǎn)數(shù)

類型數(shù)組則用于存儲(chǔ)單一類型的數(shù)據(jù)

類型數(shù)組 數(shù)據(jù)類型
Int8Array 8位二進(jìn)制補(bǔ)碼整數(shù)
Uint8Array 8位無符號(hào)整數(shù)
Uint8ClampedArray 8位無符號(hào)整數(shù)
Int16Array 16位二進(jìn)制補(bǔ)碼整數(shù)
Uint16Array 16位無符號(hào)整數(shù)
Int32Array 32位二進(jìn)制補(bǔ)碼整數(shù)
Uint32Array 32位無符號(hào)整數(shù)
Float32Array 32位IEEE浮點(diǎn)數(shù)
Float64Array 64位IEEE浮點(diǎn)數(shù)
let length = 5;
let int16 = new Int16Array(length);
let array16 = [];
array16.length = length;
for (let i=0; i<length; i++){
    int16[i] = i+1;
}
console.log(int16);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末妙痹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鼻疮,更是在濱河造成了極大的恐慌怯伊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件陋守,死亡現(xiàn)場(chǎng)離奇詭異震贵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)水评,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門猩系,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人中燥,你說我怎么就攤上這事寇甸。” “怎么了疗涉?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵拿霉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我咱扣,道長(zhǎng)绽淘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任闹伪,我火速辦了婚禮沪铭,結(jié)果婚禮上壮池,老公的妹妹穿的比我還像新娘。我一直安慰自己杀怠,他們只是感情好椰憋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著赔退,像睡著了一般橙依。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硕旗,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天窗骑,我揣著相機(jī)與錄音,去河邊找鬼漆枚。 笑死慧域,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浪读。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼辛藻,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼碘橘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吱肌,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤痘拆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后氮墨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺蛆,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年规揪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了桥氏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡猛铅,死狀恐怖字支,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奸忽,我是刑警寧澤堕伪,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站栗菜,受9級(jí)特大地震影響欠雌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疙筹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一富俄、第九天 我趴在偏房一處隱蔽的房頂上張望禁炒。 院中可真熱鬧,春花似錦蛙酪、人聲如沸齐苛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凹蜂。三九已至,卻和暖如春阁危,著一層夾襖步出監(jiān)牢的瞬間玛痊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工狂打, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留擂煞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓趴乡,卻偏偏與公主長(zhǎng)得像对省,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晾捏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一蒿涎、ES6簡(jiǎn)介 ? 歷時(shí)將近6年的時(shí)間來制定的新 ECMAScript 標(biāo)準(zhǔn) ECMAScript 6(亦稱 ...
    一歲一枯榮_閱讀 6,062評(píng)論 8 25
  • 一、基礎(chǔ)知識(shí):1惦辛、JVM劳秋、JRE和JDK的區(qū)別:JVM(Java Virtual Machine):java虛擬機(jī)...
    殺小賊閱讀 2,369評(píng)論 0 4
  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡(jiǎn)單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,104評(píng)論 0 21
  • 以美好的心情書寫壯麗的人生! 作者簡(jiǎn)介: 唐華智胖齐,筆名智壹玻淑,籍貫廣西賓陽,42歲呀伙,現(xiàn)在南寧鐵路局南寧機(jī)務(wù)段從事紀(jì)檢...
    智壹閱讀 425評(píng)論 0 1
  • 從今天開始,不再為別人活著 不以物喜不以己悲最高目標(biāo) 活心情不活人生 驰弄,沒有什么比早睡對(duì)現(xiàn)在的我更有吸引力了 麻汰。
    _沛沛沛閱讀 56評(píng)論 0 0