简单的函数方法

数组去重

1
2
3
4
##### 简单数组去重, 如:uniq([1, 3, 5, 3, 1])

* 利用ES6新增数据类型 Set
* Set类似于数组,但是成员的值都是唯一的,没有重复的值。

function uniq(arry) {
return […new Set(arry)];
}

1
* indexOf

function uniq(arry) {
var result = [];
for (var i = 0; i < arry.length; i++) {
if (result.indexOf(arry[i]) === -1) {
//如 result 中没有 arry[i],则添加到数组中
result.push(arry[i])
}
}
return result;
}

1
* includes

function uniq(arry) {
var result = [];
for (var i = 0; i < arry.length; i++) {
if (!result.includes(arry[i])) {
//如 result 中没有 arry[i],则添加到数组中
result.push(arry[i])
}
}
return result;
}

1
* reduce

function uniq(arry) {
return arry.reduce((prev, cur) => prev.includes(cur) ? prev : […prev, cur], []);
}

1
* Map

function uniq(arry) {
let map = new Map();
let result = new Array();
for (let i = 0; i < arry.length; i++) {
if (map.has(arry[i])) {
map.set(arry[i], true);
} else {
map.set(arry[i], false);
result.push(arry[i]);
}
}
return result;
}

1
2
3
4
5

#### flat
* 利用Array.prototype.flat
* ES6 为数组实例新增了 flat方法,用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数组没有影响。
* flat默认只会 “拉平” 一层,如果想要 “拉平” 多层的嵌套数组,需要给 `flat` 传递一个整数,表示想要拉平的层数。

function flattenDeep(arr, deepLength) {
return arr.flat(deepLength);
}
console.log(flattenDeep([1, [2, [3, [4]], 5]], 3));

1
* 当传递的整数大于数组嵌套的层数时,会将数组拉平为一维数组,JS能表示的最大数字为 Math.pow(2, 53) - 1,因此我们可以这样定义 flattenDeep 函数

function flattenDeep(arr) {
//当然,大多时候我们并不会有这么多层级的嵌套
return arr.flat(Math.pow(2,53) - 1);
}
console.log(flattenDeep([1, [2, [3, [4]], 5]]));

1
* 利用 reduce 和 concat

function flattenDeep(arr){
return arr.reduce((acc, val) => Array.isArray(val) ?
acc.concat(flattenDeep(val)) : acc.concat(val), []);
}
console.log(flattenDeep([1, [2, [3, [4]], 5]]));

1
2

* 使用 stack 无限反嵌套多层嵌套数组

function flattenDeep(input) {
const stack = […input];
const res = [];
while (stack.length) {
// 使用 pop 从 stack 中取出并移除值
const next = stack.pop();
if (Array.isArray(next)) {
// 使用 push 送回内层数组中的元素,不会改动原始输入 original input
stack.push(…next);
} else {
res.push(next);
}
}
// 使用 reverse 恢复原数组的顺序
return res.reverse();
}
console.log(flattenDeep([1, [2, [3, [4]], 5]]));
`