实现数组方法flat
// 实现1
var flat1 = (arr, number = 10) => {
let result = [],count = 0;
var helper = (arr) => {
let res = [];
count++;
for (let item of arr) {
if (Array.isArray(item)) {
if (count === number) {
break;
}
res = res.concat(helper(item));
} else {
res.push(item);
}
}
return res;
};
result = result.concat(helper(arr));
return result;
};
// 实现2
var flat2 = (arr) => {
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flat2(cur) : cur);
}, []);
};
实现数组去重
// 实现1
var unique1 = (arr) => {
return [...new Set(arr)];
};
// 实现2
var unique2 = (arr) => {
let result = [];
for (let i = 0; i < arr.length; i++) {
if (result.indexOf(arr[i]) === -1) {
result.push(arr[i]);
}
}
return result;
};
// 实现3
var unique3 = (arr) => {
arr.sort();
let result = [arr[0]];
for (let i = 1; i < arr.length; i++) {
if (arr[i] !== result[result.length - 1]) {
result.push(arr[i]);
}
}
return result;
};
// 实现4
var unique4 = (arr) => {
const map = {};
if (arr && Array.isArray(arr)) {
for (let i = arr.length - 1; i >= 0; --i) {
if (arr[i] in map) {
arr.splice(i, 1);
} else {
map[arr[i]] = true;
}
}
}
return arr;
};
实现数组filter
Array.prototype._filter = function (fn) {
let result = [];
for (let i = 0; i < this.length; i++) {
if (fn(this[i], i, this)) {
result.push(this[i]);
}
}
return result;
};
测试:
var nums = [4,8,9,10];
console.log(nums.filter((n) => n > 8)); // [9,10]
console.log(nums._filter((n) => n > 8)); // [9,10]
语法:
var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])
实现数组reduce
Array.prototype._reduce = function (callback, initial) {
let i = 0;
let acc = initial === undefined ? this[i++] : initial;
for (; i < this.length; i++) {
acc = callback(acc, this[i], i, this);
}
return acc;
};
测试:
console.log([1, 2, 3].reduce((acc, cur) => acc + cur)); // 6
console.log([1, 2, 3].reduce((acc, cur) => acc + cur, 10)); // 16
console.log([1, 2, 3]._reduce((acc, cur) => acc + cur)); // 6
console.log([1, 2, 3]._reduce((acc, cur) => acc + cur, 10)); // 16
语法:
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
实现数组交集
// 实现1:filter实现
var intersect1 = (a, b) => a.filter((x) => b.indexOf(x) > -1);
// 实现2:Set实现
var intersect2 = (a,b) => a.filter(x => new Set(b).has(x));
测试:
intersect1([1, 2], [2, 3]); //[2]
intersect2([1, 2, 3], [2, 3, 4]); //[2, 3]
实现数组并集
// 实现1:filter + concat实现
var union1 = (a, b) => a.concat(b.filter((x) => !(a.indexOf(x) > -1)));
// 实现2:Set实现
var union2 = (a, b) => [...new Set([...a, ...b])];
测试:
union1([1, 2], [2, 3]); //[1,2,3]
union2([1, 2, 3], [2, 3, 4]); //[1,2,3,4]
More
Array
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array
Array.prototype.filter()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
Array.prototype.reduce()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
Array.prototype.flat()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat