数组有关API及知识点

(懒得在这边重新布局了,可直接看分享的链接http://note.youdao.com/noteshare?id=c2cc91874bbaab02b873b03712c07af6&sub=A7D6B08931BA429E8BFF2FADC6D98731

前言:工作中涉及了很多数组的操作,以下一一罗列出常用的操作API及一些知识点,以供熟悉和查询,提高效率。更全面的数组API及Array构造器的方法见http://louiszhai.github.io/2017/04/28/array/

数组的API操作demo见 本地文件demo-self/math-api.html 或7.1math-api.html存到本地查看

总体划分

数组原型的基本方法主要分为可改变自身值的、不会改变的和迭代方法。

基于ES6,改变自身值的方法一共有9个,分别为pop、push、reverse、shift、sort、splice、unshift,以及两个ES6新增的方法copyWithin 和 fill。

pop() 方法删除一个数组中的最后的一个元素,并且返回这个元素。

push()方法添加一个或者多个元素到数组末尾,并且返回数组新的长度。

reverse()方法颠倒数组中元素的位置,第一个会成为最后一个,最后一个会成为第一个,该方法返回对数组的引用。

shift()方法删除数组的第一个元素,并返回这个元素。

sort()方法对数组元素进行排序,并返回这个数组。

splice()方法用新元素替换旧元素的方式来修改数组。

unshift() 方法用于在数组开始处插入一些元素(就像是栈底插入),并返回数组新的长度。

copyWithin() 方法基于ES6,用于数组内元素之间的替换,即替换元素和被替换元素均是数组内的元素。

fill() 方法基于ES6,它同样用于数组元素替换,但与copyWithin略有不同,它主要用于将数组指定区间内的元素替换为某个值。

基于ES7,不会改变自身的方法一共有9个,分别为concat、join、slice、toString、toLocateString、indexOf、lastIndexOf、未标准的toSource以及ES7新增的方法includes。

concat() 方法将传入的数组或者元素与原数组合并,组成一个新的数组并返回。

join() 方法将数组中的所有元素连接成一个字符串。

slice() 方法将数组中一部分元素浅复制存入新的数组对象,并且返回这个数组对象。

toString() 方法返回数组的字符串形式,该字符串由数组中的每个元素的 toString() 返回值经调用 join() 方法连接(由逗号隔开)组成。

toLocaleString() 类似toString()的变型,该字符串由数组中的每个元素的 toLocaleString() 返回值经调用 join() 方法连接(由逗号隔开)组成

indexOf() 方法用于查找元素在数组中第一次出现时的索引,如果没有,则返回-1。

astIndexOf() 方法用于查找元素在数组中最后一次出现时的索引,如果没有,则返回-1。并且它是indexOf的逆向查找,即从数组最后一个往前查找。

includes() 方法基于es7,它用来判断当前数组是否包含某个指定的值,如果是,则返回 true,否则返回 false。

toSource() 方法是非标准的,该方法返回数组的源代码,目前只有 Firefox 实现了它。

所有API的使用可见上述链接,以下仅列出了部分最常用方法。

第一组:操作方法

方法

含义

参数

会否改变原数组

返回值

concat()

拼接数组

要加入的数组或数组变量名

不会

拼接好的新数组

slice()

截取数组

(start,end)起始结束位置,包左不包右

不会

所截取的数组的部分

splice()

可对数组进行删除、插入、替换

(start,num,replace)起始位置、项数、替换值

被删除的项、插入则返回[]、被替换的项

splice方法的使用方式主要有以下3种

1.删除:可以删除任意数量的项,指定2个参数,要删除的第一项的位置和要删除的项数。

splice(0,2)删除数组的前两项。

2.插入:指定3个参数:起始位置,0(要删除的项数)和要插入的项。splice(2,0,"red","green")。

3.替换:可向指定位置插入任意数量的项,splice(2,1,"red","green")

示例:

var a = [1,2,3,4,5,6,7];

// concat 拼接数组

var colors = a.concat(["yellow",["black","brown"]]);

var colors2 = a.concat("yellow","black","brown");

console.log(a) // [1, 2, 3, 4, 5, 6, 7]

console.log (colors) // [1, 2, 3, 4, 5, 6, 7, "yellow", ["black", "brown"]]

console.log (colors2) // [1, 2, 3, 4, 5, 6, 7, "yellow", "black", "brown"]

// slice 截取数组

var cut1 = a.slice(2)

var cut2 = a.slice(2,5)

console.log(cut1) // [3, 4, 5, 6, 7]

console.log(cut2) // [3, 4, 5]

// splice 删除、添加、替换数组

var origin1 = [1,2,3,4,5,6,7,8,9]

var del1 = origin1.splice(2) // 从第3项开始删除

console.log(origin1) // [1, 2]

console.log(del1) // [3, 4, 5, 6, 7, 8, 9]

var origin2 = [1,2,3,4,5,6,7,8,9]

var del2 = origin2.splice(2,3) // 从第3项开始删除3项

console.log(origin2) // [1, 2, 6, 7, 8, 9]

console.log(del2) // [3, 4, 5]

var origin3 = [1,2,3,4,5,6,7,8,9]

var del3 = origin3.splice(2,3,'no') // 从第3项开始删除3项,替换成'no'

console.log(origin3) // [1, 2, "no", 6, 7, 8, 9]

console.log(del3) // [3, 4, 5]

第二组:位置方法

indexOf()和lastIndexOf()。这两个方法都接受两个参数:要查找的项和表示查找起点位置的索引。indexOf()从数组的开头开始向后查找,lastIndexOf()从数组的末尾开始向前查找。

示例:

// 数组位置方法

var b = [1,2,3,4,5,6]

var loc1 = b.indexOf(5)

var loc2 = b.indexOf(5,2)

var loc3 = b.indexOf (3,5)

console.log(loc1) // 4

console.log(loc2) // 4

console.log(loc3) // -1 表示从第6项开始找没有找到3

var loc11 = b.lastIndexOf(5)

console.log(loc11) // 4 从后面开始查找,不是说要改变index值

第三组:迭代方法(实际使用非常广泛!)

1、基本用法

每个方法接受两个参数,要在每一项上运行的函数和运行该函数的作用域对象,传入这些方法中的函数会接收三个参数:数组项的值、该项在数组中的位置和数组对象本身(item,index,array)。

以上方法都会修改数组中包含的值

以下是5个迭代器方法的作用

(1)every():对数组的每一项运行给定函数,如果数组的每一项都返回true,则返回true。对数组应用该方法,有返回值为true或false

示例:

// 数组迭代方法 every() 必须每一项都返回true 则返回true

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

var everyResult=numbers.every(function (item,index,array) {

  return(item>2);

});

console.log(everyResult); //false

(2)some():对数组的每一项运行给定函数,如果数组的任一项都返回true,则返回true。对数组应用该方法,有返回值为true或false

示例:

// 数组迭代方法 some() 某一项返回true 则返回true

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

var someResult=numbers.some(function (item,index,array) {

  return(item>2);

});

console.log(someResult); //true

(3)filter():对数组的每一项运行给定函数,返回该函数中会返回true的项组成的数组。有返回值,为符合条件的项组成的数组

示例:

// 数组迭代方法filter()利用指定的函数确定返回在数组中包含某一项。 返回一个所有的数值都要大于2的数组。

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

  var filterResult=numbers.filter(function (item,index,array) {

   return(item>2);

  });

  console.log(filterResult); // [3, 4, 5, 4, 3]

(4)map():对数组的每一项运行给定函数,有返回每次函数调用的结果组成的数组。

示例:

// 数组迭代方法map()也返回一个数组。而这个数组的每一项都是在原始数组中的对应上运行入函数的结果。

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

var mapResult=numbers.map(function (item,index,array) {

return item * 2;

  });

  console.log(mapResult); //[2, 4, 6, 8, 10, 8, 6, 4, 2]

(5)forEach():对数组的每一项运行给定函数,这个方法没有返回值。本质上与使用for循环迭代数组是一样的。

示例:

// 数组迭代方法forEach()

numbers.forEach(function(item,index,array){

  //执行某些操作

})

2、深入

在实际使用中,通常不是简单的数组,更多的是数组里面嵌套了对象,甚至有多层对象,对这些对象进行相关的操作。基于以上数组的API,用好三个参数即可,对目前接触到的几个常用操作如下示例:

给定一个数组,如下形式:对象{}有相同的键值结构

var compli = [

{name: 'lsq1', age: '25', sex: 'girl' , address: '杭州'},

{name: 'lsq2', age: '34', sex: 'boy' , address: '杭州'},

{name: 'lsq3', age: '12', sex: 'girl' , address: '武汉'},

{name: 'lsq4', age: '45', sex: 'boy' , address: '湖南'}

]

1、取出某一个键的值,组成新的数组

var getname = compli.map((item,index,arr)=>item.name)

console.log(getname) // ["lsq1", "lsq2", "lsq3", "lsq4"]

2、修改某些键的名称以及添加新的键

var scoreAll = [88,89,90,100]

var addNew = compli.map((item, index) => {

return { // 对每一项操作,返回一个对象,结果汇总成一个数组

'姓名': item.name,

isAlive: true,

score: scoreAll[index], // scoreAll可为外部的数组

}

})

console.log(addNew)

// [{姓名: "lsq1", isAlive: true, score: 88},

// {姓名: "lsq2", isAlive: true, score: 89},

// {姓名: "lsq3", isAlive: true, score: 90},

// {姓名: "lsq4", isAlive: true, score: 100}]

3、操作原数组,将原数组中每个对象的某个键值修改、删除某个属性

var changeV = compli.forEach((item, index) => {

item.sex = '不详' // sex都改成不详

delete item.age // 删除age这个属性

})

console.log(changeV) // undefined 无返回值

console.log(compli)

// [{name: "lsq1", sex: "不详", address: "杭州"},

// {name: "lsq2", sex: "不详", address: "杭州"},

// {name: "lsq3", sex: "不详", address: "武汉"},

// {name: "lsq4", sex: "不详", address: "湖南"}]

4、获得这个数组中年龄大于20的人的名字,组成新数组返回

var getOld = class1.filter((item,index,arr)=> (item.age > 20))

console.log (getOld)

// [{name: 'lsq1', age: '25', sex: 'girl' , address: '杭州'},

// {name: 'lsq2', age: '34', sex: 'boy' , address: '杭州'},

// {name: 'lsq4', age: '45', sex: 'boy' , address: '湖南'}]

var getOldName = getOld.map((item)=>item.name)

console.log(getOldName) // ["lsq1", "lsq2", "lsq4"]

// 综合就是 getOldName = class1.filter((item,index,arr)=> (item.age > 20)).map((item)=>item.name)

5、获取这个数组中某个对象的属性名

var key1 = Object.keys(class1)

var key2 = Object.keys(class1[0]) // class1[0]才是对象

console.log(key1) // ["0", "1", "2", "3"]

console.log(key2) //["name", "age", "sex", "address"]

6、获取数组对象中每一个对象的属性名(不相同)

var class2 = [

{name: 'lsq1', age: '25', sex: 'girl'},

{age: '34', sex: 'boy' , address: '杭州'},

{name: 'lsq3', age: '12', address: '武汉'}

]

var collectKey = []

var keyMany = class2.forEach((item,index,arr)=>{

var keyall = Object.keys(item)

collectKey.push(keyall)

})

console.log(keyMany) // undefined

console.log('collectKey', collectKey)

//[["name", "age", "sex"],["age", "sex", "address"],["name", "age", "address"]]

3、利用for遍历

注:用这些api解决不了的,就用for操作吧!只是没有这么简洁

  javascript原生遍历方法的建议用法:

  • 用for循环遍历数组
  • 用for-in遍历对象
  • 用for-of遍历类数组对象(ES6)
  • 用Object.keys()获取对象属性名的集合

1、for循环

for(var i=0;i<arrTmp.length;i++){

   console.log(i+": "+objTmp[i])

}

2、for-in 遍历对象属性,i指代属性名;遍历数组i指代索引值

for(var i in arrTmp){

    console.log(i+": "+arrTmp[i])

}

3、for-of 它被设计用来遍历各种类数组集合,例如DOM NodeList对象、Map和Set对象,甚至字符串也行

// for-of遍历Map对象

let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);

for (let [key, value] of iterable) {

  console.log(value); //输出 1 2 3

}

4、Object.keys 获取对象属性名的集合

let xyz = {z: "zzz", x: "xxx", y: "yyy"};

console.log(Object.keys(xyz)); // ["z", "x", "y"]

具体用法不赘述,可见 https://www.cnblogs.com/yangshifu/p/7377102.html

第四组:归并方法

reduce()和reduceRight()。他们的区别在于从哪头开始遍历数组,除此之外,它们完全相同。

这两个方法都接收两个参数:一个在每一项上调用的函数和(可选)作为归并基础的初始值。

传给reduce()和reduceRight()的函数接收4个参数:(prev,cur,index,array) 前一个值、当前值、项的索引和数组对象。

reduce( ) 方法从数组的第一项开始,逐个遍历到最后。

reduceRight()方法则从数组的最后一个开始,向前遍历到第一项。

示例:

// 数组归并方法 reduce()

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

var sum1 = values.reduce(function(prev,cur,index,array){

 return prev + cur;

})

console.log(sum1); // 15 从头开始遍历数组相加

// 数组归并方法 reduceRight()

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

var sum2 = values.reduceRight(function(prev,cur,index,array){

 return prev*cur;

})

console.log(sum2); // 120 从头开始遍历数组相乘

附:本文所参考引用的链接如下:

https://blog.csdn.net/shuidinaozhongyan/article/details/77815150

https://blog.csdn.net/weixin_41470109/article/details/79910348

https://www.cnblogs.com/yangshifu/p/7377102.html

https://blog.csdn.net/weixin_41470109/article/details/79912772

非常全面:http://louiszhai.github.io/2017/04/28/array/

发布了41 篇原创文章 · 获赞 65 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/cindy647/article/details/87886913
今日推荐