学习Javascript数据结构与算法(第2版)笔记(2)

第 2 章 数组

1. 创建和初始化数组

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

arr.length  //数组长度

访问元素和迭代数组

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 方法(添加到数组末尾)

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

2.2 使用 unshift 方法(插入元素到数组首位)

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 方法(删除数组里最靠后的元素)

arr.pop();

3.2 使用 shift 方法(从数组首位删除元素)

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

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

使用 splice 方法(通过指定位置/索引添加或删除相应位置和数量的元素)

arr.splice(1,2); // 从数组索引1开始删除2个元素
arr.splice(1,0,7,8,9); // 从数组索引1开始添加3个元素
arr.splice(1,2,7,8,9);//从数组索引1开始删除2个元素,并从索引1开始添加3个元素

5. 二维和多维数组

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 数组方法参考

方法名 描述
concat 连接2个或更多数组,并返回结果
every 对数组中的每一项运行给定函数,如果该函数对每一项都返回 true ,则返回 true
filter 对数组中的每一项运行给定函数,返回该函数会返回 true 的项组成的数组
forEach 对数组中的每一项运行给定函数。这个方法没有返回值
join 将所有的数组元素连接成一个字符串
indexOf 返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1
lastIndexOf 返回在数组中搜索到的与给定参数相等的元素的索引里最大的值
map 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
reverse 颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个
slice 传入索引值,将数组里对应索引范围内的元素作为新数组返回
some 对数组中的每一项运行给定函数,如果任一项返回 true ,则返回 true
sort 按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数
toString 将数组作为字符串返回
valueOf 和 toString 类似,将数组作为字符串返回
6.1 数组合并 (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 迭代器函数
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 方法会迭代数组中的每个元素,直到返回 false )
nums.every(isEven); //1

2. 用 some 方法迭代( some 方法会迭代数组的每个元素,直到函数返回 true)
nums.some(isEven);//1,2

3. 用 forEach 方法迭代(迭代整个数组,与for循环相同)
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 和数组的新功能
方 法 描 述
@@iterator 返回一个包含数组键值对的迭代器对象,可以通过同步调用得到数组元素的键值对
copyWithin 复制数组中一系列元素到同一数组指定的起始位置
entries 返回包含数组所有键值对的 @@iterator
includes 如果数组中存在某个元素则返回 true ,否则返回 false 。ES7新增
find 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素
findIndex 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素在数组中的索引
fill 用静态值填充数组
from 根据已有数组创建一个新数组
keys 返回包含数组所有索引的 @@iterator
of 根据传入的参数创建一个新数组
values 返回包含数组中所有值的 @@iterator

ES6和ES7新增的数组方法。

方 法 描 述
@@iterator 返回一个包含数组键值对的迭代器对象,可以通过同步调用得到数组元素的键值对
copyWithin 复制数组中一系列元素到同一数组指定的起始位置
entries 返回包含数组所有键值对的 @@iterator
includes 如果数组中存在某个元素则返回 true ,否则返回 false 。ES7新增
find 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素
findIndex 根据回调函数给定的条件从数组中查找元素,如果找到则返回该元素在数组中的索引
fill 用静态值填充数组
from 根据已有数组创建一个新数组
keys 返回包含数组所有索引的 @@iterator
of 根据传入的参数创建一个新数组
values 返回包含数组中所有值的 @@iterator
6.3.1 使用 forEach 和箭头函数迭
nums.forEach(function(x){
   console.log(x%2==0); 
});

num.forEach(x => {console.log(x%2==0)})
6.3.2 使用 for...of 循环迭代
for(let n of nums){ //n 代表数组中每一项
    console.log((n%2==0)?'even':'odd');
}
6.3.3 使用ES6新的迭代器( @@iterator )

ES6还为 Array 类增加了一个 @@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

数组的 entries 、 keys 和 values 方法

1. entries 方法返回包含键值对的 @@iterator 
let aEntries = nums.entries(); // 得到键值对的迭代器
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 方法返回包含数组索引的 @@iterator
let aKeys = nums.keys(); // 得到数组索引的迭代器
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 则包含数组的值
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 方法(根据已有的数组创建一个新数组)
let nums2 = Array.from(nums);

let evens = Array.from(nums,x => {x%2==0});
6.3.5 使用 Array.of 方法(根据传入的参数创建一个新数组)
let num3 = Array.of(1);
let num4 = Array.of(1, 2, 3, 4, 5, 6);
等价于:
let num3 = [1];
let num4 = [1, 2, 3, 4, 5, 6];

复制已有数组:
let numCopy = Array.of(...num4);
6.3.6 使用 fill 方法(用静态值填充数组。参数:填充数、开始索引、结束索引)
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 方法(复制数组中的一系列元素到同一数组指定的起始位置)
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;
});
等价于:
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;
});

对带有重音符号的字符做排序
var names2 = ['Maève', 'Maeve'];
console.log(names2.sort(function(a, b){
    return a.localCompare(b);
}));
6.5 搜索

indexOf 方法返回与参数匹配的第一个元素的索引, lastIndexOf 返回
与参数匹配的最后一个元素的索引

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 方法
数组里存在某个元素, includes 方法会返回 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 输出数组为字符串
把数组里所有元素输出为一个字符串,可以用 toString 方法
console.log(nums.toString());

用一个不同的分隔符(比如 - )把元素隔开,可以用 join 方法
var numsString = nums.join('-');
console.log(numsString);
6.7 类型数组
类型数组 数据类型
Int8Array 8位二进制补码整数
Uint8Array 8位无符号整数
Uint8ClampedArray 8位无符号整数
Int16Array 16位二进制补码整数
Uint16Array 16位无符号整数
Int32Array 32位二进制补码整数
Uint32Array 32位无符号整数
Float32Array 32位IEEE浮点数
Float64Array 64位IEEE浮点数

类型数组则用于存储单一类型的数据

类型数组 数据类型
Int8Array 8位二进制补码整数
Uint8Array 8位无符号整数
Uint8ClampedArray 8位无符号整数
Int16Array 16位二进制补码整数
Uint16Array 16位无符号整数
Int32Array 32位二进制补码整数
Uint32Array 32位无符号整数
Float32Array 32位IEEE浮点数
Float64Array 64位IEEE浮点数
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);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 一、ES6简介 ​ 历时将近6年的时间来制定的新 ECMAScript 标准 ECMAScript 6(亦称 ...
    一岁一枯荣_阅读 6,042评论 8 25
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,360评论 0 4
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 5,092评论 0 21
  • 以美好的心情书写壮丽的人生! 作者简介: 唐华智,笔名智壹,籍贯广西宾阳,42岁,现在南宁铁路局南宁机务段从事纪检...
    智壹阅读 416评论 0 1
  • 从今天开始,不再为别人活着 不以物喜不以己悲最高目标 活心情不活人生 ,没有什么比早睡对现在的我更有吸引力了 。
    _沛沛沛阅读 56评论 0 0