js之数组操作常用方法及注意事项

拓展js在线运行工具可运行JavaScrip代码,做一些简单的调试;复杂的Javascript运行,建议直接用Chrome的控制台调试(即随便打开Chrome一个页面,点击F12进入调试界面,然后选择console控制台,在控制台中输入js代码即可)。

1. forEach()的使用及注意事项

forEach的使用频率很高,多用于对数组自身的改变和各元素相关统计性的计算,重要特性如下:可以改变数组自身,没有返回值;中途不能用常规操作跳出循环,可以用抛出异常(try/catch)的方式,但不推荐这样做。

  • 改变数组自身:当数组中元素是值类型,forEach不会改变数组元素;当是引用类型,则可以改变数组元素


    image.png
  • 链式操作:forEach不支持链式操作;调用forEach之前,数组支持链式操作


    forEach不支持链式操作.png

    调用forEach之前,数组支持链式操作.png

2. map()的使用及注意事项

map()功能很强大,forEach()的一些局限性它很多都能解决。"map"即"映射",也就是原数组被"映射"成对应新数组。

  • 创建新数组不代表不能用它改变原数组,用原有数组去承载就可实现改变原数组


    改变原数组.png
  • map()中每个元素都要执行相应的回调函数,所以必须要有return;map()基本上无法对数组做过滤处理


    map操作必须要有return.png

3. filter()的使用

众所周知,map()没法做到的过滤,就交给filter()去完成。filter()和map()很像,也是创建一个新数组,新数组中的元素是筛选出来的符合条件的所有对象。使用如下:


image.png

4. sort()的使用

sort()用于对数组的元素进行排序。排序顺序可以是字母或数字,并按升序或降序。使用如下:


image.png
  • sort()与map()、filter()等不同,它直接改变原始数组
  • 如果想按照其他标准进行排序,就需提供比较函数compareFunction(a,b),数组会按照调用该函数的返回值排序,即a和b是两个将要比较的元素
    • 如果compareFunction(a,b)小于0,则a排列到b之前;
    • 如果 compareFunction(a, b)等于0,a和b的相对位置不变(并不保证);
    • 如果 compareFunction(a, b)大于0,b排列到a之前;


      排序.png

5. some()的使用

some()也是很好的一个方法,用于检查数组中是否有某些符合条件的元素。只要有一个满足即返回true,之后的不再执行,对性能很友好。


some操作只要有一个满足即返回true.png

6. every()的使用

如果说some()是 ||判断,那every()就是&&判断,它用于检测数组中的每一项是否都满足条件,只有都满足了才会返回true。

every操作需每一项都满足条件才返回true.png

7. 其他经典处理方法

(1) 数组去重

  • 数组元素是值类型:可用new Set()去重(注意:new Set()会将结果转换成对象)
let tempArr = new Set([1,2,3,3,4,4,5])
// => {1,2,3,4,5} 

//并且已有元素是添加不进去的:
tempArr.add(3) 
// => {1,2,3,4,5}

tempArr.add(6)
// => {1,2,3,4,5,6}

  • 数组元素是引用类型:Set()无法对 元素是引用对象的数组 进行去重
let mySet = new Set();
mySet.add(1); // Set(1) {1}
mySet.add(5); // Set(2) {1, 5}
mySet.add(5); // Set(2) {1, 5} 这里体现了值的唯一性
mySet.add('some text'); 
[...mySet]
// => [1,5,'some text']

mySet.add({name:'jay Chou',age:40});
mySet.add({name:'jay Chou',age:40});

[...mySet]
// => [1,5,'some text',{name:'jay Chou',age:40},{name:'jay Chou',age:40}]

  • .uniqWith():Lodash是一个一致性、模块化、高性能的JavaScript实用工具库。它提供了一个很好的方法——.uniqWith()
import _ from 'lodash';
<script>
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
_.uniqWith(objects, _.isEqual);
</script>

//=> [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]

其中, _.isEqual(value,other)用于执行深比较来确定两者的值是否相等。 _.uniqWith()做去重处理。

(2) 查找指定元素:判定当前数组里是否有某个元素,若有则获取该元素

当需要在数组中找到指定的元素并返回给我们时:some()只会告诉我们该元素是否存在; 使用filter()可以实现该需求;但如果我们已经知道这个数组里有且仅有一个我们想要的元素,出于性能的考虑,并不想用filter()从头遍历到尾(filter不支持中断遍历),此时可使用如下方法来实现。

  • 使用 findIndex():若有该元素则返回第一次出现在数组中的的索引值,若没有该元素则返回-1
    满足条件则返回第一个满足条件的元素索引值.png
没有一个满足则返回-1.png

也可以使用Lodash提供的_.findIndex(),通过对象属性值直接获取对应索引:let index = _.findIndex(arr, {name:'伏羲'});注意:IE 11 及更早版本不支持findIndex() 方法;所以,如果对浏览器兼容有要求,那就用Lodash的 _.findIndex()。

  • 使用 find():在数组中找到我们所需要的元素,并且和some()一样,只要有一个满足即返回该元素,不会多余遍历,对性能很友善。
    首次满足条件就返回该元素.png

    不满足条件则返回undefined.png

(3) 删除指定元素:判定当前数组里是否有某个元素,若有则把它删除

  • 使用 splice()
    删除指定元素.png

8. 其他汇总

  • 计算数值型数组中元素的最大(小)值
var arr = [1,3,4,5,8,4];
var max = Math.max.apply(null, arr);
console.log(max);  //=> 8

var min = Math.min.apply(null, arr);
console.log(min);  //=> 1

  • 计算数值型数组中各元素之和

a. 普通方法

var arr = [1,3,4,5,8,4];
var result = 0
for(var i=0;i<arr.length;i++){
  result = result + arr[i]
}
console.log(result);  //=> 25

b. 优化:和普通算法(遍历)相比,下面的算法时间复杂度会降低很多,并且数据量越大越有优势

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