数组展开
- 常规版
function flatten(arr) {
let res = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) res = res.concat(flatten(arr[i]));
else res.push(arr[i]);
}
return res;
}
- reduce 版
function flatten(arr) {
return arr.reduce((acc, cur) => {
return Array.isArray(cur) ? acc.concat(flatten(cur)) : acc.concat(cur);
}, []);
}
- 指定深度版
function flattenByDeep(arr, deep) {
deep = deep || 1;
let res = [];
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i]) && deep > 1) {
res = res.concat(flattenByDeep(arr[i], deep - 1));
} else res = res.concat(arr[i]);
}
return res;
}
数组乱序
function flush(arr) {
for (let i = 0; i < arr.length; i++) {
// Math.floor([0,1)*size) => [0,size-1]
let index = Math.floor(Math.random() * arr.length);
[arr[i], arr[index]] = [arr[index], arr[i]];
}
}
数组去重
[1,2,2,3] => [1,2,3]
- 创造一个对象标记元素是否出现过
function unique(arr) {
let container = {};
return arr.filter(item => {
if (container.hasOwnProperty(item)) {
return false;
}
container[item] = true;
return true;
});
- 利用 indexOf()
function unique(arr) {
return arr.filter((e, i) => arr.indexOf(e) === i);
}
- 利用 Set()
const unique = arr => Array.from(new Set(arr));
const unique = arr => [...new Set(arr)];
数组去重2 去除所有重复的值
利用 indexOf() 和 lastIndexOf(); indexOf() 从头开始搜索,lastIndexOf() 从尾部开始搜索
function unique(arr) {
return arr.filter(e => arr.indexOf(e) === arr.lastIndexOf(e));
}
手写 reduce
Array.prototype.reduce = function (fn, init) {
let acc = init || this[0];
let start = init ? 0 : 1;
for (let i = start; i < this.length; i++) {
acc = fn(acc, this[i], i, this);
}
return acc;
};