去重操作

第一种方式, ES 6 引入的新书据结构 Set 本身就是没有重复数据的, 可以使用这个数据结构来转化数组.
时间复杂度 O(n)

1
2
3
4
5
6
const target = [];
const sourceArray = [1,1,2,3,4,2,3,4,5,6,5,7];
new Set(sourceArray).forEach(current => {
target.push(current);
});
console.log(target); // [ 1, 2, 3, 4, 5, 6, 7 ]

第二种方式, 使用 indexOf 或者 lastIndexOf 两个方法, 判断循环位置到整个数组的开始或者结束, 是不是还存在相同值
时间复杂度 O(n), 可能比上面的循环要长, 少一步 Set 的构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const source = [1,1,2,3,4,2,3,4,5,6,7,6,5,4];

function noRepeat(array) {
let tempArr = [];
for(let i = array.length - 1; i >= 0; i -= 1) {
let firstIndex = array.indexOf(array[i]);
if(firstIndex === i) {
tempArr.unshift(array[i]);
}
}
return tempArr;
} console.log(noRepeat(source)); //[ 4, 5, 6, 7, 3, 2, 1 ]

过滤 null 和 undefined

1
2
3
4
const source = [1,2,3, null, undefined, 4, null];
const target = source.filter(current => {
return current !== null && current !== undefined;
})

取得每个元素的指定属性

1
2
3
4
5
6
7
8
9
const lists = [{ name: 'a', value: 1}, { name: 'b', value: 2 }, { name: 'c', value: 3}];
function pluck(args, current) {
let tempArr = [];
for(let i in args) {
tempArr.push(args[i][current])
}
return tempArr;
}
pluck(lists, name)

取最大值最小值

1
2
Math.max.apply(null, [0,1,2,3,4,5,-1,-2]);  //5
Math.min.apply(null, [0,1,2,3,4,5,-1,-2]); //-2

Array.isArray 类型判断方法

这个方法会判断传入参数是不是一个数组, 这是一个浏览器的原生方法, 需要 IE 9+ 的支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 下面的函数调用都返回 true
Array.isArray([]);
Array.isArray([1]);
Array.isArray(new Array());
// 鲜为人知的事实:其实 Array.prototype 也是一个数组。
Array.isArray(Array.prototype); // 下面的函数调用都返回 false
Array.isArray();
Array.isArray({});
Array.isArray(null);
Array.isArray(undefined);
Array.isArray(17);
Array.isArray('Array');
Array.isArray(true);
Array.isArray(false);
Array.isArray({ __proto__: Array.prototype });

Array.of 创建方法

使用参数创建数组, 和 Array() 不一样的是, 如果传入的参数是一个数值, 依然会被当作数组元素, 而不是数组长度

1
2
Array(3).fill('a')  // ['a', 'a', 'a']
Array.of(3).fill('a') // ['a']

对值操作的方法

这一部分的方法基本不会对原数组产生影响

concat

这个方法用来合并数组, 而且是生成一个新数组返回, 不会影响到原来的数组, 所以可以用来做数组平坦话操作和克隆操作

1
2
3
4
[1, 2, 3].concat()  // 返回一个新的 [1, 2, 3]
[1, 2, 3].concat(4) // [1, 2, 3, 4]
[1, 2, 3].concat([4]) // [1, 2, 3, 4]
[1, 2, 3].concat(4, [5]) // [1, 2, 3, 4, 5]

有一个地方需要注意, 数组是一个引用类型的值, 如果存在嵌套数组的情况, 被嵌套数组的引用会被合并到返回数组当中, 这就会对原数组产生影响了

1
2
3
4
5
6
let a = [[1]];
let b = [2, [3]];
let c = a.concat(b); // [[1], 2, [3]]
c[0].push(4);
c; //[[1, 4], 2, [3]]
a; //[[1, 4]]

slice

方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。且原始数组不会被修改.

1
2
3
[1,2,3].slice();  //[ 1, 2, 3 ]
[1,2,3].slice(1, 1); //[]
[1,2,3].slice(1, 2); //[ 2 ]

这个方法经常用来把类数组元素转化为数组

1
[].slice.call({ 0: 0, 1: 1, 2: 2, length: 3});  //[ 0, 1, 2 ]

copyWithin

使用数组内部值, 返回一个对原数组的修改结果, 同样不会修改原数组

filter

从原数组进行筛选, 选出符合条件的值创建新数组

1
2
'1234567'.split('').filter(value => value > 3);  //[ '4', '5', '6', '7' ]
'abcde'.split('').filter(() => true); //[ 'a', 'b', 'c', 'd', 'e' ]

join

把数组当中的所有元素拼接成一个字符串.
这个方法可以看作是和 String.prototype.split 互为反操作

1
2
[ '1', '2', '3', '4', '5' ].join('_');  //'1_2_3_4_5'
'1_2_3_4_5'.split('_'); //[ '1', '2', '3', '4', '5' ]

map

收集操作, 数组当中的值会一次被传入一个函数当中执行, 所有的结果组合成新数组返回.

1
[1,2,3].map(value => value**2);  //[ 1, 4, 9 ]

reduce, reduceRight

归化操作, 把数组中的所有元素合并成为一个值.
reduce 的顺序是从左向右, reduceRight 的顺序是从右开始的

1
2
3
const arr = 'abcde'.split('');
arr.reduce((prevent, current) => prevent + current); //'abcde'
arr.reduceRight((prevent, current) => prevent + current); //'edcba'

对原数组修改的方法

fill 填充数组

使用传入的参数填充数组, 传入的参数会被当作是固定值来处理, 如果是一个函数, 会首先计算出函数取值, 然后再填充到需要作修改的位置.
这个函数还可以按照位置进行填充

1
2
Array(3).fill(Math.random() * 100 >> 2);  //[ 18, 18, 18 ]
'abcde'.split('').fill(0, 2,4); //[ 'a', 'b', 0, 0, 'e' ]

push, pop

push, 在数组的最右面增加新值, 函数的返回值为新值.
pop, 在数组的最右面删除值, 被删除的值会作为返回值返回.

1
2
3
4
5
let a = [1, 2, 3];  //undefined
a.push(4); //4
a; //[ 1, 2, 3, 4 ]
a.pop(); //4
a; //[ 1, 2, 3 ]

shift, unshift

shift, 删除数组的第一个元素, 并且返回这个元素的值
unshift, 在数组的第一个位置增加一个元素

1
2
3
4
5
6
let a = '12345'.split('');
a; //[ '1', '2', '3', '4', '5' ]
a.shift(); //'1'
a; //[ '2', '3', '4', '5' ]
a.unshift(0); //5
a; //[ 0, '2', '3', '4', '5' ]

reverse

这个方法会把原数组当中的位置的颠倒.
数组和字符串可以相互转换, 这个方法还可以用来颠倒字符串.

1
2
[1,2,3].reverse();  //[ 3, 2, 1 ]
'12345'.split('').reverse().join(''); //'54321'

sort

这个方法会对原数组进行排序, 默认根据 unicode 码点进行排序, 可以传入比较参数进行 DIY

1
2
3
[1,2,3,11,22,33].sort();  //[ 1, 11, 2, 22, 3, 33 ]
let a = [1,2,3,11,22,33].sort((left, right) => left > right);
a; //[ 1, 2, 3, 11, 22, 33 ]

splice

通过删除, 或者增加一个元素的方式, 来变更数组内容

1
2
3
4
5
let a = '12345'.split('');
a.splice(2, 2, 0); //[ '3', '4' ]
a; //[ '1', '2', 0, '5' ]
a.splice(2, 1); //[ 0 ]
a; //[ '1', '2', '5' ]

条件判断方法

every

需要所有数组中的元素都满足条件, 才会返回 true.

1
2
[1, 2, 3].every(value => value > 0);  //true
[1, 2, 3].every(value => value > 2); //false

some

只要有一个元素满足条件, 就会返回 true.

1
[1, 2, 3].some(value => value > 2);  //true

includes

判断一个数组是否包含指定值

1
[1, 2, 3].includes(2);  //true

查找方法

find 查找值, 函数参数

返回第一个满足条件的值, 没有就返回 undefined

1
[1,2,3,4,5].find(value => value > 3);  //4

findIndex 查找索引

返回第一个满足条件的索引, 否则返回 -1

1
[1,2,3,4,5].findIndex(value => value > 3);  //3

indexOf 查找索引, 值参数

1
2
[1, 2, 3].indexOf(2);  //1
[1, 2, 3].indexOf(0); //-1

lastIndexOf 查找最后一个索引

1
2
[1, 2, 3, 1, 2, 3].lastIndexOf(2);  //4
[1, 2, 3, 1, 2, 3].lastIndexOf(0); //-1

遍历方法

forEach 循环整个数组

对数组中的每个元素执行一次传入函数, 不可以中断

1
2
3
let count = '';
'abcde'.split('').forEach(value => count += value);
count; //'abcde'

entries 迭代方法

返回一个数组的迭代器, 包含元素的索引和值

1
2
3
4
5
6
let a = 'abcde'.split('');  //undefined [ 'a', 'b', 'c', 'd', 'e' ]
let i = a.entries(); //{}
let a0 = i.next(); //undefined
a0; //{ value: [ 0, 'a' ], done: false }
let a1 = i.next(); //undefined
a1; //{ value: [ 1, 'b' ], done: false }

key 返回索引的迭代方法

返回值只包含索引

1
2
3
4
let a = 'abcde'.split('');
let k = a.keys(); //{}
let a0 = k.next(); //undefined
a0; //{ value: 0, done: false }

array 数组去重 过滤空值等方法的更多相关文章

  1. JavaScript数组去重的几种方法

    这个老问题,网上普遍都有了,为什么要再写一遍呢,主要是为了记个笔记... 遍历时搜索结果数组 思路很明确,如下 新建一个数组存放结果 循环遍历原数组,对于每一个元素,在结果数组中搜索是否存在 若不存在 ...

  2. JavaScript中数组去重的几种方法

    JavaScript中数组去重的几种方法 正常情况下,数据去重的工作一般都是由后端同事来完成的,但是前端也要掌握好处理数据的能力,万一去重的工作交给我们大前端处理,我们也不能怂呀.现在我总结了一些去重 ...

  3. js中数组去重的几种方法

    js中数组去重的几种方法         1.遍历数组,一一比较,比较到相同的就删除后面的                 function unique(arr){                 ...

  4. 关于数组去重的几种方法-------javascript描述

    第一种方法:借助json对象来实现,若json对象中无该属性则添加,否则不添加,最后返回json对象的属性,时间复杂度为O(n) function deleteArrayRepeat(arr) { v ...

  5. js数组去重的4种方法

    js数组去重,老生长谈,今天对其进行一番归纳,总结出来4种方法 贴入代码前 ,先对浏览器Array对象进行支持indexOf和forEach的polyfill Array.prototype.inde ...

  6. js数组去重的三种常用方法总结

    第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中   Array.p ...

  7. javascript数组去重的三种常用方法,及其性能比较

    在进行数组操作时往往会遇到去掉重复项的问题,下面简单介绍下数组去重的方法,以及其执行效率 方法一        采用两次循环        原理:拿当前的和他后面的比,如果后面的有重复的就干掉     ...

  8. JavaScript数组去重的10种方法

    「数组去重」的确是个老生常谈的问题了,但是你真正的掌握了吗?平时开发中是不是用最简单粗暴的方法来去重?注意到它的性能问题了吗?当面试官对你回答的四个去重方法都不满意时你可以想出更简单且性能能更好的方法 ...

  9. JS实现数组去重的6种方法总结

    方法一: 双层循环,外层循环元素,内层循环时比较值,如果有相同的值则跳过,不相同则push进数组. Array.prototype.distinct = function(){ var arr = t ...

随机推荐

  1. Dockerize a .NET Core application

    Dockerize a .NET Core application Introduction This example demonstrates how to dockerize an ASP.NET ...

  2. 分布式爬虫scrapy-redis中settings.py中的配置信息

    SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 使用scrapy-redis的调度器 ITEM_PIPELINES = { 'sc ...

  3. QT移植无法启动 This application failed to start because it could not find or load the QT platform

    QT配置好在自己机器上可以运行,但在别人机器上一直弹出 "This application failed to start because it could not find or load ...

  4. sprinf sprintf_s 的用法

    函数功能: 将数据格式化输出到字符串 函数原型: int sprintf( char *buffer, const char *format [,argument] ... ) 注意这里的buffer ...

  5. http协议的状态码解释

    一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务器超时 下面提供 HTTP 状态码的完整列表.点击链接可了解详情.您也可以访问 HTTP 状态码上的 ...

  6. 小程序之取标签中内容 例如view,text

    // index.wxml页面 data-url为自定义 {{}}中内容可为后台请求到的数据 也可为固定内容例如:data-text="哈哈哈" data-url="ht ...

  7. JDBC Connection Configuration

    如果在Jmeter 中想用到连接数据库的功能,必须下载jar包,常见的关系型数据库jar包见以下共享链接 链接:https://pan.baidu.com/s/1t-k9RW141lw0j_QSw53 ...

  8. [osg][opengl]透视投影的参数Perspective

    gluPerspective这个函数指定了观察的视景体(frustum为锥台的意思,通常译为视景体)在世界坐标系中的具体大小,一般而言,其中的参数aspect应该与窗口的宽高比大小相同.比如说,asp ...

  9. 分割窗口QSplitter类

    概述 分割窗口QSplitter类在应用程序中经常用到,它可以灵活分割窗口的布局,经常用在类似文件资源管理器的窗口设计中 在Qt开发中,QSplitter是比较常用到的,也就是分割窗口.并且窗口分割处 ...

  10. 使用git命令行解决冲突

    文章转载自:https://blog.csdn.net/sureSand/article/details/78765727 使用git和提交的代码有所冲突,用IDE自带的git工具功能多了反而不知道怎 ...