JavaScript数组知多少

数组的维基百科定义是:

编程言语中,数组数据结构(英语:array data structure),简称数组(英语:Array),是一种数据结构,是数据元素(elements)的鸠合。元素能够经由过程索引来恣意存取,索引通常是数字,用来盘算元素之间存储位置的偏移量。

不幸的是JavaScript没有像此类数组一样的数据结构,但供应了一种具有一些类数组特征的对象,它把数组下标转变成字符串,用其作为属性。

运用数组

1.建立数组

var numbers = [];    //[]操纵符声清楚明了一个空的数组,长度为0。

var numbers = new Array();    //与上等价

var numbers = [1,2,3,4,5];

var numbers = new Array(1,2,3,4,5);    //组织函数传入初始值

var numbers = new Array(5);     //只传入一个参数,用来指定数组的长度

var objects = [1,"Joe",true, null];    //在 JavaScript 里数组中的元素不必是同一种数据范例。

引荐运用 [ ] 操纵符建立数组,这类体式格局效力更高。

JavaScript许可数组包括恣意夹杂范例的值

var obj = ['string', 21, true, null, undefined, ['hzzly', 21], {object: true}, NaN];

2.数组长度

var arr = [1, 2, 3, 4, 5];

arr.length   //5

JavaScript数组的 length 是没有上界的

假如你用大于或即是当前 length 的数字作为下标来存储一个元素,那末 length 值会被增大以包容新元素,不会发作数组越界毛病。

var arr = [];

arr.length       //0

arr[1000] = true;

arr.length      //1001

//但 arr 只包括一个属性

3.由字符串天生数组

split() 要领用于把一个字符串分割成字符串数组。

var str = 'hzzly';

var arr  = str.split('');

console.log(arr);   // ["h", "z", "z", "l", "y"]

4.对数组的整体性操纵

当把一个数组赋给别的一个数组时,只是为被赋值的数组增加了一个新的援用。当你经由过程原援用修改了数组的值,别的一个援用也会感知这个变化(浅复制)。而深复制是指将原数组中的每一个元素都复制一份到新数组中。

存取函数

1.indexOf()

indexOf() 用来查找进来的参数在目的数组中是不是存在。假如目的数组包括该参数,就返回该元素在数组中的索引;假如不包括,就返回-1。假如数组中包括多个雷同的元素,indexOf()
函数老是返回第一个与参数雷同的元素的索引。lastIndexOf(),该函数返回雷同元素中末了一个元素的索引,假如没找到雷同元素,则返回-1。

var arr = ["h", "z", "z", "l", "y"];

arr.indexOf('h');  //0

arr.indexOf('l')   //3

arr.indexOf('z')   //1

arr.lastIndexOf('z')   //2

2.数组的字符串示意

join()toString() 要领都返回一个包括数组一切元素的字符串,默许各元素之间用逗号离开。当直接对一个数组运用 print()
函数时,体系会自动挪用数谁人数组的tostring()要领。

var arr = ["h", "z", "z", "l", "y"];

arr.join()   //"h,z,z,l,y"

arr.toString()   //"h,z,z,l,y"

3.由已有数组建立新数组

concat() 要领能够兼并多个数组建立一个新数,concat() 要领发起者是一个数组,参数是另一个数组。作为参数的数组,个中的一切元素都被连接到挪用 concat() 要领的数组背面;
splice() 要领截取一个数组的子集建立一个新数组;splice() 要领从现有数组里截取一个新数组,该要领的第一个参数是截取的肇端索引,第二个参数是截取的长度。

var a = ['h','z'];

var b = ['z','l','y'];

var c = a.concat(b)   //["h", "z", "z", "l", "y"]

var myFish = ['angel', 'clown', 'mandarin', 'surgeon'];
// 移除 0 个元素从下标 2, 插进去 'drum'
var removed = myFish.splice(2, 0, 'drum');
// myFish is ['angel', 'clown', 'drum', 'mandarin', 'surgeon']
// removed is [], 没有元素被移除

// 移除下标为 3 的元素
removed = myFish.splice(3, 1);
// myFish is ['angel', 'clown', 'drum', 'surgeon']
// removed is ['mandarin']

// 移除下标为 2 的元素, 然后插进去 'trumpet' 到下标 2 
removed = myFish.splice(2, 1, 'trumpet');
// myFish is ['angel', 'clown', 'trumpet', 'surgeon']
// removed is ['drum']

// 从下标为 0 最先移除两个元素, 然后插进去 'parrot', 'anemone' and 'blue'
removed = myFish.splice(0, 2, 'parrot', 'anemone', 'blue');
// myFish is ['parrot', 'anemone', 'blue', 'trumpet', 'surgeon']
// removed is ['angel', 'clown']

// removes 2 elements from index 3
removed = myFish.splice(3, Number.MAX_VALUE);
// myFish is ['parrot', 'anemone', 'blue']
// removed is ['trumpet', 'surgeon']

可变数组

1.增加元素

push()要领会将一个元素增加到数组末端,返回数组新长度值,也能够运用数组的length属性为数组增加元素,但push()要领看起来更直观。
unshift() 要领能够将元素增加在数组的开首,也能够经由过程一次挪用,为数组增加多个元素。
splice()要领能够为数组增加元素,需供应以下参数:肇端索引(亦即你愿望增加元素的处所),须要删除的元素个数(增加元素时该参数设为0),想要增加数组的元素(栗子能够看上面的)。

var arr=['h'];

arr.push('z');   //2   arr的值为["h","z"]

arr.unshift('y')   //3   arr的值为["y","h","z"]

2.删除元素

pop() 要领能够删除数组末端的元素,返回被删除的值
shift() 要领能够删除数组的第一个元素,返回被删除的值。数组中的元素自动前移,比pop慢的多
splice() 要领能够指定要删除的下标和个数,第一个参数是下标,第一个参数是要删除元素的个数,返回值为所删除的元素

var arr = ["h", "z", "z", "l", "y"];

arr.pop()  //返回y     arr的值为["h", "z", "z", "l"]

arr.shift()  //返回h     arr的值为["z", "z", "l"]

arr.splice(1,2)  //返回["z", "l"]     arr的值为["z"]

3.排序

reverse()要领将数组中元素的以中心位置举行翻转。
sort() 会对数组根据字典递次举行排序。

运用sort()对数字排序,须要传入一个大小比较函数:

function compare(num1,num2) {
    return num1 - num2;
}
var nums = [3,1,2,100,4,200];
nums.sort(compare);   //[1, 2, 3, 4, 100, 200]

迭代器要领

1.不天生新数组的迭代器要领

forEach() 该要领接收一个函数运用参数,对数组中的每一个元素运用该函数。
every() 该要领接收一个返回值为布尔范例的函数,对数组中得每一个元素运用该函数,假如关于一切的元素,该函数都返回 true, 则该要领返回 true。
some() 该要领也接收一个返回值为布尔范例的函数,只需有一个元素使得该函数返回true,该要领就返回 true。
reduce() 该要领接收一个函数,返回一个值。该要领会从一个累加值最先,不停对累加值和数组中的后续元素挪用该函数,直到数组中的末了一个元素,末了返回获得的累加值;也能够用来将数组中的元素连接成一个长的字符串。

var arr = [1,2,3,4,5]

arr.forEach(function(item,index){   //让数组中的每一项做一件事变
    console.log(item,index)
})

var result = arr.every(function(item,index){   //检测数组中的每一项是不是相符前提
    return item > 0 
})

var result = arr.some(function(item,index){   //检测数组中是不是有某些项相符前提(只要满足一个即为true)
    return item > 1 
})

var result = arr.every(function(pre,next){   //让数组中的前项和后项做某种盘算,并累计最终值
    return pre + next
})

2.天生新数组的迭代器要领

map() ,和 forEach() 相似,对数组中的每一个元素运用某个函数,区分在于返回一个新的数组,该数组的元素是对原有元素运用某个函数获得的效果。
filter() ,和 every() 相似,传入一个返回值为布尔范例的函数,差别的是当对数组中红一切元素运用该函数时,效果均为 true 时, 该要领不返回
true,二十返回一个新数组,该数组包括运用该函数后效果为true 的元素。

var arr = [1,2,3,4,5]
var newArr = arr.map(function(item,index){   //让数组经由过程某种盘算发生一个新数组
    return item * 2
})
newArr => [2,4,6,8,10]

var newArr2 = arr.filter(function(item,index){   //筛选出数组中相符前提的项,构成新数组
    return item > 3 
})
newArr2 => [4,5]

二维数组和多维数组

1.建立二维数组

Array.matrix = function(numrows,numcols,initial) {
    var arr = [];
    for (var i = 0; i < numrows; ++i) {
        var columns = []; 
        for (var j = 0; j < numcols; ++j) {
            columns[j] = initial;
        }
    arr[i] = columns;
    }
    return arr;
}

数组 完

以上皆为个人观点 如若有误 还望斧正

参考书本

  1. 《JavaScript言语精炼》

  2. 《JavaScript高等程序设计》

    原文作者:hzzly
    原文地址: https://segmentfault.com/a/1190000007848567
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞