[JS-9] JavaScript 数组

数组

数组(array)是一个有序的数据集合,我们可以通过数组名称和索引进行访问。

Array 参考

创建数组

  • 使用内置 Array 构造函数
  • 使用数组字面量
const arr1 = new Array('A', 2, 'good');
const arr2 = [3, 'c', 547];

注意 new Array 的其他情况:

const arr = new Array(2);   // 长度为2,没有任何元素的数组
const arr = Array(2);   // 同上

// 下面也有同样效果
const arr = [];
arr.length = 2;

所以 arr = [42];arr = new Array(42); 效果是不一样的!
Array(N) 这里 N 必须是整数。

const arr = new Array(9.3);   // RangeError: invalid array length

稀疏数组

const arr = [,,,,];   // arr.length为4,浏览器会自动忽略最后一个逗号

数组元素的添加和删除

  • 直接赋值
    const arr = [];
    arr[0] = 1;
    arr[1] = 2;
    console.log(arr);   // [1, 2]
    
  • delete 删除值而不会改变数组长度
    const arr = [1, 2, 3, 4];
    delete arr[2];
    console.log(arr);   // [1, 2,,4]
    
  • push() 在数组末尾添加元素
  • unshift() 在数组开头添加元素
  • pop() 在数组末尾删除元素
  • shift() 在数组开头删除元素
    const arr = [1, 2, 3];
    arr.push(4);   // [1, 2, 3, 4]
    arr.unshift(0);   // [0, 1, 2, 3, 4]
    arr.pop();   // [0, 1, 2, 3]
    arr.shift();   // [1, 2, 3]
    
  • splice() 在数组指定位置插入或删除元素,并返回被删除的内容
    const arr = [1, 2, 3, 4, 5, 6];
    
    // 一个参数时,表示从数组的哪里(下标)开始删除元素
    let n = arr.splice(4);
    
    console.log(n);   // [5, 6]
    console.log(arr);   // [1, 2, 3, 4]
    
    // 第二个参数表示删除几个元素,0表示不删除元素
    n = arr.splice(2, 1);
    
    console.log(n);   // [3]
    console.log(arr);   // [1, 2, 4]
    
    // 第三个参数开始,表示添加到数组的元素
    n = arr.splice(2, 0, 'a', 'b')
    
    console.log(n);   // []
    console.log(arr);   // [1, 2, 'a', 'b', 4]
    
    // 可以使用展开运算符
    const k = [7, 8, 9];
    
    n = arr.splice(2, 2, ...k);
    console.log(n);   // ['a', 'b']
    console.log(arr);   // [1, 2, 7, 8, 9, 4]
    

遍历数组

  • forEach() 为每个元素调用指定的函数,不改变原数组
    const arr = [1, 2, 3, 4];
    let sum = 0;
    
    arr.forEach(val => {
      sum += val;
    })
    
    console.log(arr);   // [1, 2, 3, 4]
    console.log(sum);   // 10
    
  • map() 为每个元素调用指定的函数,并返回一个数组,不改变原数组
    const arr = [1, 2, 3, 4];
    var arr2 = [];
    
    arr2 = arr.map(val => {
      return val * 2;
    })
    
    console.log(arr);   // [1, 2, 3, 4]
    console.log(arr2);   // [2, 4, 6, 8]
    
  • for
    const arr = [1, 2, 3, 4];
    
    for(let i = 0; i < arr.length; i++) {
      console.log(arr[i])
    }
    
    // 1,2,3,4
    
  • for...in
    const arr = [1, 2, 3, 4];
    
    for(let i in arr) {
      console.log(arr[i])
    }
    
    // 1,2,3,4
    
  • for...of
    const arr = [1, 2, 3, 4];
    
    for(let item of arr) {
      console.log(item)
    }
    
    // 1,2,3,4
    

注意 for...infor...of 的区别
for...in 循环出来的是 key
for...of 循环出来的是 value

检验数组

  • every() 检测数组所有元素是否都符合指定条件,如果有一个元素不满足条件,则返回 false 并停止检索。如果所有元素都满足条件,则返回 true
    const arr = [13, 23, 33, 43];
    
    arr.every(val => { return val > 10; })   // true
    arr.every(val => { return val < 30; })   // false
    
  • some() 检测数组所有元素是否都符合指定条件,如果有一个元素满足条件,则返回 true 并停止检索。如没有满足条件的元素,则返回 false
    const arr = [13, 23, 33, 43];
    
    arr.some(val => { return val > 30; })   // true
    arr.some(val => { return val > 100; })   // false
    
  • includes() 判断数组是否包含一个指定的值,有返回 true,否则返回 false
    const arr = [13, 23, 33, 43];
    
    arr.includes(23);   // true
    arr,includes(24);   // false
    

数组查找

  • filter() 查找数组中符合条件的所有元素,创建并返回一个新数组
    const arr = [13, 23, 33, 43];
    
    arr.filter(val => { return val < 30; })   // [13, 23]
    
  • find() 返回指定数组中满足条件的第一个元素,否则返回 undefined
    const arr = [13, 23, 33, 43];
    
    arr.find(val => { return val > 30; })   // 33
    arr.find(val => { return val > 100; })   // undefined
    
  • findIndex() 返回指定数组中满足条件的第一个元素的索引,否则返回 -1
    const arr = [13, 23, 33, 43];
    
    arr.findIndex(val => { return val > 30; })   // 2
    arr.findIndex(val => { return val > 100; })   // -1
    
  • indexOf() 搜索数组中的元素,并返回它首次出现位置的索引,没有则返回 -1
    const arr = [13, 23, 33, 33, 33, 43];
    
    arr.indexOf(33);   // 2
    arr.indexOf(53);   // -1
    
  • lastIndexOf() 搜索数组中的元素,并返回它最后出现位置的索引,没有则返回 -1
    const arr = [13, 23, 33, 33, 33, 43];
    
    arr.lastIndexOf(33);   // 4
    arr.lastIndexOf(53);   // -1
    

其他数组操作

  • concat() 连接两个或更多的数组,并返回结果,不改变原数组
    const arr1 = [1, 2, 3];
    const arr2 = [4, 5, 6];
    const arr3 = [];
    
    arr3 = arr1.concat(arr2, 7, 8);
    
    console.log(arr1);   //[1, 2, 3]
    console.log(arr2);   //[4, 5, 6]
    console.log(arr3);   //[1, 2, 3, 4, 5, 6, 7, 8]
    
  • copyWithin() 从数组的指定位置拷贝元素到数组的另一个指定位置,并返回结果,会改变原数组内容,但不改变长度 length
    [1, 2, 3, 4].copyWithin(2);   // [1, 2, 1, 2]
    [1, 2, 3, 4].copyWithin(2, 1);   // [1, 2, 2, 3]
    [1, 2, 3, 4].copyWithin(2, 0);   // [1, 2, 1, 2]
    [1, 2, 3, 4].copyWithin(2, 0, 1);   // [1, 2, 1, 4]
    [1, 2, 3, 4].copyWithin(-1);   // [1, 2, 3, 1]
    [1, 2, 3, 4].copyWithin(-2, -3, -1);   // [1, 2, 2, 3]
    
  • fill() 使用一个固定值来填充数组
    [1, 2, 3].fill(4);   // [4, 4, 4]
    [1, 2, 3].fill(4, 1);   // [1, 4, 4]
    [1, 2, 3].fill(4, 1, 2);   // [1, 4, 3]
    [1, 2, 3].fill(4, -3, -2);   // [4, 2, 3]
    
  • from() 从一个类似数组或可迭代对象中创建一个新数组
    Array.form('foo');   // ['f', 'o', 'o']
    Array.form([1, 2, 3], x => x + x);   // [2, 4, 6]
    
    // 可以用来转换 `arguments` 或获取到的 DOM List 等类数组对象
    function fn() {
      let arr = Array.from(arguments);
    
      console.log(arguments);
      console.log(arr);
    }
    
    fn(21, 31, 41);
    // { 0: 21, 1: 31, 2: 41 }
    // [21, 31, 41]
    
  • join() 将数组中所有元素转换为一个字符串
    ['f', 'o', 'o'].join('');   // 'foo'
    ['f', 'o', 'o'].join('+');   // 'f+o+o'
    
  • reduce() 接收一个函数作为累加器,数组中每个值(从左至右)开始缩减,最终计算为一个值
    [1, 2, 3, 4].reduce((sum, val) => {
      return sum += val;
    })
    
    // 10
    
    // 可以设置累加器初始值
    
    [1,2,3,4].reduce((sum, val) => {
      return sum += val;
    }, 10)
    
    // 20
    
  • reduceRight()reduce() 作用相同,只是从右向左计算。
  • reverse() 翻转数组
    const arr = [1, 2, 3];
    arr.reverse();
    
    console.log(arr);   // [3, 2, 1]
    
  • slice() 选取数组的一部分,并返回一个新数组,不改变原数组
    const arr = [1, 2, 3, 4, 5];
    
    arr.slice(1);   // [2, 3, 4, 5]
    arr.slice(1, 3);   // [2, 3]
    arr.slice(1, -1);   // [2, 3, 4]
    arr.slice(-2);   // [4, 5]
    arr.slice(-4, 3);   // [2, 3]
    arr.slice(-4, -2);   // [2, 3]
    arr.sclie(-2, 1);   // []
    
  • sort() 对数组元素进行排序
    const arr = [2, 5, 1, 9, 3];
    
    arr.sort();
    
    console.log(arr);   // [1, 2, 3, 5, 9]
    

    sort() 方法默认按 Unicode 位点进行排序

    const arr= ['02', '31', '1', '12', '416', '42', '304'];
    
    arr.sort();
    
    console.log(arr);   // [ '02', '1', '12', '304', '31', '416', '42' ]
    

    sort() 支持一个方法:
    sort((a, b) => a - b)

    • 回调函数返回值小于等于 0,a 在 b 前;
    • 回调函数返回值大于 0,b 在 a 前;
    const arr= ['02', '31', '1', '12', '416', '42', '304'];
    
    arr.sort((a, b) => {
      return a - b;
    })
    
    console.log(arr);   // [ '1', '02', '12', '31', '42', '304', '416' ]
    
  • toString() 将数组转化成字符串
    const arr = [1, 2, 3];
    let str = '';
    
    str = arr.toString();
    
    console.log(str);   // '1,2,3'
    console.log(arr);   // [1, 2, 3]
    

多维数组

数组里包含数组,就是一个多维数组

// 创建一个多维数组
const arr = [];

for (let i = 0; i < 2; i++) {
  arr[i] = [];
  for (let j = 0; j < 2; j++) {
    arr[i].push(i + j);
  }
}

console.log(arr);   // [[0, 1], [1, 2]]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容