去重操作

第一种方式, 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. Spring Boot 2 入门

    Spring Boot其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. 参考网上资料,一路踩了几个坑,终于搞出了 ...

  2. better-scroll影响vue中radio和checkbox的双向数据绑定

    我的解决办法:radio <input v-model="answer" type="radio" name="answer" val ...

  3. The issus in Age Progression/Regression by Conditional Adversarial Autoencoder (CAAE)

    The issus in Age Progression/Regression by Conditional Adversarial Autoencoder (CAAE) Today I tried ...

  4. Twenty score

    1.上图中有两个人对读书的看法有较大的不同. There are two people in the cartoon who treat books in completely different w ...

  5. 【JS】JavaScript中innerHTML与innerText,createTextNode的区别

    innerHTML和innerText 它们都会把元素内内容替换掉,区别在于: innerHTML 会把替换内容里的 HTML 标记解释执行. innerText 会把替换内容里的 HTML 标记原样 ...

  6. tomcat启动出现Preparing launch delegate,一直卡在100%

    本地启动项目时,Tomcat一直停留在, Starting Tomcat V8.0 Server at localhost   Preparing launch delegate...    百度可得 ...

  7. 1月4日笔记 (vi编辑器)更新...

      vi编辑器,全称是visual interface,可以执行输出.删除.查找.替换等众多的文本操作. vi并不是一个排版程序,不可以对字体.格式.段落等其他的属性进行编排. vi是全屏文本编辑程序 ...

  8. python3 session cookie

    session是保存在服务器中的,而cookies是保存在客户端中的.服务器通过session id来跟踪客户,而对于客户端而言,session id是保存在cookies中的,所以只要把cookie ...

  9. ASP.NET —— Web Pages

    为简单起见,新建一个空的web工程,再新建一个MVC的视图(.cshtml),因为WP是单页面模型,所以以后就在这个页面中进行试验. Razor语法简介: 变量可用var或者其确切类型声明. 遍历fo ...

  10. urllib模块中的方法

    urllib模块中的方法 1.urllib.urlopen(url[,data[,proxies]]) 打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作.本例试着打开google ...