第二十四天
(题目来源: 前端每日知识3+1)
Javascript题目
题目: 手写数组去重的方法(js)
解题思路
- 有多种方法可以使用es6语法
Map
,Set
,reduce
,filter
,map
- Map, Set方法具体参考阮一峰ECMAScript 6入门
问题解答
Set()方法
// 手写数组去重的方法
function deRepeat() {
return [...new Set(arguments[0])] set方法去重
}
console.log(deRepeat([1, 2, 3, 2, 1, 3, 1, 2, 4, 5, 1, 5, "e", 'w', 'w', 'w', 'w'])); //[1, 2, 3, 4, 5, "e", "w"]
Map()方法
- Map方法使用new构造一个实例对象后, 在使用set(key, value)方法, 如果对同一个键多次赋值, 后面的值将覆盖前面的值.
// 手写数组去重的方法
function deRepeat() {
let map = new Map(); // 如果对同一个键多次赋值,后面的值将覆盖前面的值。
arguments[0].forEach(item => {
return map.set(item, '')
});
return [...map.keys()];
}
console.log(deRepeat([1, 2, 3, 2, 1, 3, 1, 2, 4, 5, 1, 5, "e", 'w', 'w', 'w', 'w'])); //[1, 2, 3, 4, 5, "e", "w"]
reduce()方法
- es6新增语法includes方法
// 手写数组去重的方法
function deRepeat() {
// [includes方法](https://es6.ruanyifeng.com/#docs/array#%E6%95%B0%E7%BB%84%E5%AE%9E%E4%BE%8B%E7%9A%84-includes)
return arguments[0].reduce((init, pre) => {
if (!init.includes(pre)) {
init.push(pre)
}
return init
// 简写
// return init.includes(pre) ? init : [...init,pre]
}, [])
}
console.log(deRepeat([1, 2, 3, 2, 1, 3, 1, 2, 4, 5, 1, 5, "e", 'w', 'w', 'w', 'w'])); //[1, 2, 3, 4, 5, "e", "w"]
filter方法
- 思路就是filter是把Array的某些元素过滤掉, 然后返回剩下的元素, 使用indexOf方法就是返回当前元素在数组中第一次出现的索引位置, 条件就是如果与当前的元素索引号相同返回true
// 手写数组去重的方法
function deRepeat() {
return arguments[0].filter((item, index) => arguments[0].indexOf(item) === index)
// return newarr
}
console.log(deRepeat([1, 2, 3, 2, 1, 3, 1, 2, 4, 5, 1, 5, "e", 'w', 'w', 'w', 'w'])); //[1, 2, 3, 4, 5, "e", "w"]
map方法
- map方法就是对数组中的值进行批量修改, 但是不会改变数组的长度, 返回一个新的数组
// 手写数组去重的方法
function deRepeat() {
return arguments[0].map((item, index) => arguments[0].indexOf(item) === index ? item : "").join("").split('')
}
console.log(deRepeat([1, 2, 3, 2, 1, 3, 1, 2, 4, 5, 1, 5, "e", 'w', 'w', 'w', 'w'])); //[1, 2, 3, 4, 5, "e", "w"]
知识扩展
Map(), set()
ES6 提供三个新的方法——entries(), keys()和values()——用于遍历数组. 它们都返回一个遍历器对象 可以用for…of循环进行遍历, 唯一的区别是keys()是对键名的遍历、values()是对键值的遍历, entries()是对键值对的遍历.