数组最常见的方法

  • 操作方法
  • 排序方法
  • 转换方法
  • 迭代方法

js中数组的方法不管是写原生还是用框架,我们都会经常运用到,以及也有一些面试官会问到甚至让我们手写一个数组的排序函数;
所以我就通过查找一些好的文章做了一篇对数组方法的归纳包括:数组的基本操作方法、排序方法、转换方法以及es6中的迭代方法;

操作方法

数组的一些操作方法,也无非就是增、删、改、查:

push()
push()方法接收任意数量的参数,并将它们添加到数组末尾,返回数组的最新长度,对原数组有影响;

let people = []; // 创建一个数组
let count = people.push("张三", "李四"); // 推入两项
console.log(count) // 2

unshift()
unshift()在数组开头添加任意多个值,然后返回新的数组长度,对原数组有影响;

let people = new Array(); // 创建一个数组
let count = colors.unshift("张三", "李四"); // 从数组开头推入两项
alert(count); // 2

splice()
传入三个参数,分别是开始位置、0(要删除的元素数量)、插入的元素,返回空数组,对原数组有影响;

let people = ["张三", "李四", "王二"];
let removed = colors.splice(1, 0, "麻子")
console.log(colors) // 张三,麻子,李四,王二
console.log(removed) // []

concat()
首先会创建一个当前数组的副本,然后再把它的参数添加到副本末尾,最后返回这个新构建的数组,不会影响原始数组;

let people = ["张三", "李四", "王二"];
let people2 = people .concat("麻子", ["王朝", "马汉"]);
console.log(people ); //["张三", "李四", "王二"];
console.log(people2); // ["张三", "李四", "王二", "麻子", "王朝", "马汉"]

pop()
pop() 方法用于删除数组的最后一项,同时减少数组的length 值,返回被删除的项,对原数组有影响;

let people = ["张三", "李四"];
let item = people.pop(); // 取得最后一项
console.log(item) // 李四
console.log(people.length) // 1

shift()
shift()方法用于删除数组的第一项,同时减少数组的length 值,返回被删除的项,对原数组有影响;

let people = ["张三", "李四"];
let item = people.shift(); // 取得第一项
console.log(item) // 张三
console.log(people.length) // 1

splice()
传入两个参数,分别是开始位置,删除元素的数量,返回包含删除元素的数组,对原数组有影响;

let people = ["张三", "李四", "王二"];
let removed = people.splice(0,1); // 删除第一项
console.log(people ); // ["李四", "王二"]
console.log(removed); // ["张三"],只有一个元素的数组

slice()
slice() 方法以新的数组对象,返回数组中被选中的元素,选择从给定的 start 参数开始的元素,并在给定的 end 参数处结束,但不包括。不会影响原始数组;

let people = ["张三", "李四", "王二", "麻子", "王朝"];
let people2 = people.slice(1);
let people3 = people.slice(1, 4);
console.log(people)   // ["张三", "李四", "王二", "麻子", "王朝"]
concole.log(people2); // ["李四", "王二", "麻子", "王朝"]
concole.log(people3); // ["李四", "王二", "麻子"]

修改原来数组的内容,常用splice()

splice()
splice()传入三个参数,分别是开始位置,要删除元素的数量,要插入的任意多个元素,返回删除元素的数组,对原数组产生影响

let people = ["张三", "李四", "王二"];
let removed = people.splice(1, 1, "麻子", "王朝"); // 插入两个值,删除一个元素
console.log(people ); // ["张三", "麻子", "王朝", "王二"];
console.log(removed); //["李四"],只有一个元素的数组

即查找元素,返回元素坐标或者元素值

  • indexOf()
  • includes()
  • find()

indexOf()
返回要查找的元素在数组中的位置,如果没找到则返回-1

let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
numbers.indexOf(4) // 3

includes()
返回要查找的元素在数组中的位置,找到返回true,否则false

let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
numbers.includes(4) // true

find()
返回第一个匹配的元素

const people = [{name: "Matt",age: 27},{name: "Nicholas",age: 29}
];
people.find((element, index, array) => element.age < 28) // // {name: "Matt", age: 27}

排序方法

数组本身有两个方法可以用来对元素重新排序:

  • reverse()
  • sort()

定义排序函数:

  • 冒泡排序
  • 插入排序
  • 递并排序
  • 计数排序

reverse()
顾名思义,将数组元素方向排列

let values = [1, 2, 3, 4, 5];
values.reverse();
alert(values); // 5,4,3,2,1

sort()
sort()方法接受一个比较函数,用于判断哪个值应该排在前面

如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
1.若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
2.若 a 等于 b,则返回 0。
3.若 a 大于 b,则返回一个大于 0 的值。

function compare(value1, value2) {if (value1 < value2) {return -1;} else if (value1 > value2) {return 1;} else {return 0;}
}
let values = [0, 1, 10, 5, 15];
values.sort(compare);
alert(values); // 0,1,5,10,15

冒泡排序
排序规则:比较相邻元素,符合比较条件,交换位置较大的往后排,反复比较交换,直到所有数据都符合排序条件,得出排序效果,结束排序。
排序动态示意:

var arr = [3,4,1,2,21,5,15,6,63];
function BubbleSort(ary){for(var i = 0;  i < ary.length - 1;  i++){for(var j = i + 1;  j < ary.length;  j++){var current = ary[i];if(current > ary[j]){var tmp = ary[j];ary[j] = current;ary[i] = tmp;}}}return ary;
}
1
BubbleSort(arr); // [1, 2, 3, 4, 5, 6, 15, 21, 63]

插入排序
排序规则:插入排序得比喻成斗地主,手里摸牌之后都是按照从小到大的顺序。每摸到一张牌就把他们插入到合适的位置,使得他们比后面小,比前面大或者相等。
排序动态示意:

var arr = [3,4,1,2,21,5,15,6,63];
function InsertSort(ary){var temp;for (var i = 1; i < ary.length; i++) {for (var j = i-1; j >=0; j--) {if (ary[j+1] < ary[j]) {temp = ary[j+1];ary[j+1] = ary[j];ary[j] = temp;} else if (ary[j+1] >= ary[j]) {break;}}}return ary;
}InsertSort(arr);  // [1, 2, 3, 4, 5, 6, 15, 21, 63]

递并排序
排序规则:将长的数组分解为短的数组,一直分到最后,单个单个数组比较,我们就认为,只有一个元素的数组是有序的。然后再逐个的合并。
排序动态示意:

var arr = [3,4,1,2,21,5,15,6,63];
function MergeSort(ary) {  //采用自上而下的递归方法var len = ary.length;if(len < 2) {return ary;}var middle = Math.floor(len / 2),left = ary.slice(0, middle),right = ary.slice(middle);return merge(mergeSort(left), mergeSort(right));
}function merge(left, right)
{var result = [];while (left.length && right.length) {if (left[0] <= right[0]) {result.push(left.shift());} else {result.push(right.shift());}}while (left.length)result.push(left.shift());while (right.length)result.push(right.shift());return result;
}MergeSort(arr); // [1, 2, 3, 4, 5, 6, 15, 21, 63]

计数排序
排序规则:

  • 找出待排序的数组中最大和最小的元素,然后建立一个数组C用于统计待排数组中最小元素到最大元素区间中每个元素出现次数;
  • 统计数组中每个值为i的元素出现的次数,存入数组C的第i项;
  • 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);
  • 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1

排序动态示意:

var arr = [3,4,1,2,21,5,15,6,63];
function CountSort(ary){let obj={};for(let i=0; i<ary.length; i++){if(!obj[ary[i]]){obj[ary[i]]=1;}else{obj[ary[i]]++;}}let index=0;//遍历对象属性名,按顺序放回覆盖原数组for(let key in obj){while(obj[key]>0){ary[index]=Number(key);obj[key]--;index++}}return ary;
}CountSort(arr); // [1, 2, 3, 4, 5, 6, 15, 21, 63]

转换方法

常见的转换方法有:

  • join()

join()
join() 方法接收一个参数,即字符串分隔符,返回包含所有项的字符串

let colors = ["red", "green", "blue"];
alert(colors.join(",")); // red,green,blue
alert(colors.join("||")); // red||green||blue

迭代方法

常用来迭代数组的方法(都不改变原数组)有如下:

  • some()
  • every()
  • forEach()
  • filter()
  • map()

some()
对数组每一项都运行传入的函数,如果有一项函数返回 true ,则这个方法返回 true

let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let someResult = numbers.some((item, index, array) => item > 2);
console.log(someResult) // true

every()
对数组每一项都运行传入的函数,如果对每一项函数都返回 true ,则这个方法返回 true

let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let everyResult = numbers.every((item, index, array) => item > 2);
console.log(everyResult) // false

forEach()
对数组每一项都运行传入的函数,没有返回值

let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
numbers.forEach((item, index) => {// 执行某些操作
});

filter()
对数组每一项都运行传入的函数,函数返回 true 的项会组成数组之后返回

let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let filterResult = numbers.filter((item, index, array) => item > 2);
console.log(filterResult); // 3,4,5,4,3

map()
对数组每一项都运行传入的函数,返回由每次函数调用的结果构成的数组

let numbers = [1, 2, 3, 4, 5, 4, 3, 2, 1];
let mapResult = numbers.map((item, index, array) => item * 2);
console.log(mapResult) // 2,4,6,8,10,8,6,4,2

Javscript数组中最常用的方法(建议收藏)相关推荐

  1. java 取数组的前90位_java 从int数组中获取最大数的方法

    java 从int数组中获取最大数的方法 首先要有数组的概念吧,知道什么是数组,简单讲就是存放一组数据的一个组合,就是一个数组....哈哈 已知一个int数组, 编程从数组中获取最大数. 思路分析: ...

  2. c语言删除数组中的最小值,C语言中删除数组中某个元素的方法

    C语言中删除数组中某个元素的方法 发布时间:2020-06-17 14:22:39 来源:亿速云 阅读:1964 作者:鸽子 C语言实现删除数组中某个元素 大家知道C语言实现删除数组中某个元素方法吗? ...

  3. java中json重复数据结构_JS实现去除数组中重复json的方法示例

    本文实例讲述了JS实现去除数组中重复json的方法.分享给大家供大家参考,具体如下: var array = [{"name":"123"},{"na ...

  4. php如何向数组增加数据,php向数组中增加数据的方法是什么

    php向数组中增加数据的方法是什么? 使用函数array_push array_push()函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度. 该函数等于多次调用 $arra ...

  5. 二分法在数组内查找数c语言,C++二分法在数组中查找关键字的方法

    本文实例讲述了C++二分法在数组中查找关键字的方法.分享给大家供大家参考.具体如下: /* 此程序演示了二分法查找算法(针对按从小到大排列的数组)的实现. */ #include using name ...

  6. php 两个数组中不同的元素,PHP实现查询两个数组中不同元素的方法

    这篇文章主要介绍了PHP实现查询两个数组中不同元素的方法,涉及PHP数组差集运算与数组合并的相关技巧,需要的朋友可以参考下 本文实例讲述了PHP实现查询两个数组中不同元素的方法.分享给大家供大家参考, ...

  7. js判断数组中重复元素并找出_javascript查找数组中重复元素的方法

    这篇文章主要介绍了JS查找数组中重复元素的方法,结合具体实例形式对比分析了javascript针对数组的遍历.判断.排序等相关操作技巧,需要的朋友可以参考下 本文实例讲述了JS查找数组中重复元素的方法 ...

  8. js数组中修改元素的方法

    数组中添加元素的方法 .push() .unshift() .splice() .concat() -扩展运算符 数组中删除元素的方法 .pop() .shift() .splice() 数组中截取元 ...

  9. JS JavaScript中去除数组中重复元素的方法

    JS JavaScript中去除数组中重复元素的方法 感觉比较好理解的3种方法,总结一下,大家共同学习 方法一: Array.prototype.method1 = function(){ var a ...

最新文章

  1. Failed to load AppCompat ActionBar with unknown error
  2. “幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】
  3. Bash脚本教程之函数
  4. [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】
  5. 大数据攻略案例分析及结论
  6. Nginx安装配置详解
  7. Node.js 第一天
  8. integrate函数python_scipy.integrate Pseudo-Voigt函数,积分变为0
  9. html后代选择器的语法,后代选择器 | Descendant selectors
  10. 分享一个挺不错的Git视频教程
  11. 国内虚拟主机与香港云主机的优劣势
  12. 关于猜数字游戏以及关机指令
  13. Vue:获取v-for循环中的数组下标、索引及数据
  14. excel隐藏的选项卡和命令栏怎么找回?
  15. 通过label标记实现单选框点击文字也能选中
  16. R语言bmeta包下载
  17. Python文档基础操作
  18. 2022-2028年全球平板卫星天线收入年复合增长率CAGR为 38.6%
  19. Linux下command not found的解决办法
  20. 无人机民航执照、AOPA多旋翼、固定翼视距内驾驶员、机长考证试题+解析+答案(无人机考证试题库,持续更新...)

热门文章

  1. 少儿编程与STEAM教育-你一定想知道的
  2. MySQL批量修改表名列名大小写
  3. 双馈风力发电系统 ACDCAC变流器双馈风力发电机仿真模型
  4. Win10如何删除英语(美国)美式键盘
  5. 量子计算机中信息的基本单位,重磅!成功将“人造原子”量子位,稳定的用在量子计算机上!...
  6. python学习笔记之三——MakeHuman源码阅读
  7. 虚拟主机网站怎样搬到服务器,老站长教你网站迁移虚拟主机服务器的技巧
  8. 详解JavaScript运算符(二):字符串运算符
  9. MATLAB修改Figure里图例的名称
  10. 复盘亚马逊从优秀到卓越的24年