array 数组去重 过滤空值等方法

时间:2022-10-15 10:06:24

去重操作

第一种方式, 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. oracle 分组排序

    SELECT * FROM (SELECT A.*, RANK() OVER(PARTITION BY A.DR_ATP_ID, A.AT_CODE ORDER BY A.KEY_CODE) RANK ...

  2. Linux下Matlab崩溃的解决方法

    猜想主要是因为图形显示用了OpenGL加速造成不稳定. 我的运行环境是: Ubuntu 10.04 LTS 64bit Matlab R2010b 解决方法是启动时用: $MATLAB_DIR/bin ...

  3. WAF指纹探测及识别技术

    Web应用防护系统(也称:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HT ...

  4. selenium + ChromeDriver

    Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.而对于爬虫来说,使用Selenium操控浏览器来爬取网上的数据那么肯定是爬虫中的杀 ...

  5. 微信小程序获取formId时提示"the formId is a mock one"

    微信小程序使用模板消息需要使用表单提交 formId,因此进行了简单的代码测试,在 wxml 文件中创建 form 对象,并在 form 标签中声明属性 report-submit="tru ...

  6. poj2912(带权并查集+枚举)

    题目链接:http://poj.org/problem?id=2912 题意:给n个人,m组关系,玩石头剪刀布的游戏,n个人中除一个人judge以外,其他人属于3个group(即石头.剪刀.布),他们 ...

  7. Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)

    在Java中,实现定时任务有多种方式,本文介绍4种,Timer和TimerTask.Spring.QuartZ.Linux Cron. 以上4种实现定时任务的方式,Timer是最简单的,不需要任何框架 ...

  8. excel如何快速实现数据区域的框选

    这里会存在2个情况,一个是快速的选择一行或者一列的数据,另外一个是快速的选择一块的数据(数据区域) 1.当有上万条数据时,怎么快速的选择一行或一列的数据? 方法:将鼠标放在需要选择的数据区域的开头位置 ...

  9. php检查是否是数字和字母

    /* 检查是否是数字和字母* php内置函数ctype_alnum检查字符串是否是数字和字母,或者两者混合* $string*/ public function is_numandlitter($st ...

  10. python基础(二)--多值参数以及类

    1.多值参数函数 def 函数名(*args , **kwargs): ....... 多值参数函数顾名思义能够传入多个参数,args表示传入的元组,kwargs表示传入的字典 def functio ...