数组置空
let arr = [1,2,3]arr = []// 只是改变引用地址,数组先前的内容依旧保存在内存中,当数据量比较大时,可以会造成内存泄漏let arr = [1,2,3]arr.length = 0// 可以彻底清空arr数据的内容let arr = [1,2,3]arr.splice(0, arr.length);// 调用实例方法 splice 删除数组所有元素
注意:通过arr.length清空数组,需要注意当一个数组赋值给多个变量时,多个变量指向同一个数组的引用地址,那么清空一个变量,会导致其他变量也为空,所以在初始赋值时可以考虑使用深拷贝规避下这个问题。
三种方式效率简单对比:
var a = [];for (var i = 0; i < 100000000; i++) {a.push(i);}console.time("splice");a.splice(0, a.length);console.timeEnd("splice");var b = [];for (var i = 0; i < 100000000; i++) {b.push(i);}console.time("length");b.length = 0;console.timeEnd("length");var c = [];for (var i = 0; i < 100000000; i++) {c.push(i);}console.time("赋值[]");c = [];console.timeEnd("赋值[]");
数组中的最小值和最大值
可以简单地使用 Math.min() 或 Math.max() 结合扩展运算符 …
const nums = [2, 4, 6, 8, 1, 3, 5, 7];Math.max(...nums); // 8Math.min(...nums); // 1
数组对象
const minBy = (arr, fn) =>Math.min(...arr.map(typeof fn === 'function' ? fn : val => val[fn]));minBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], x => x.n); // 2minBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], 'n'); // 2
const maxBy = (arr, fn) =>Math.max(...arr.map(typeof fn === 'function' ? fn : val => val[fn]));maxBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], x => x.n); // 8maxBy([{ n: 4 }, { n: 2 }, { n: 8 }, { n: 6 }], 'n'); // 8
数组去重
ES6 Set去重
var arr = [1,1,8,8,12,12,15,15,16,16];function unique (arr) {return Array.from(new Set(arr))}console.log(unique(arr))//[1,8,12,15,16]// 数组去重let arr = [1, 1, 2, 3];let unique = [... new Set(arr)];let a = new Set([1, 2, 3]);let b = new Set([4, 3, 2]);// 并集let union = [...new Set([...a, ...b])]; // [1,2,3,4]// 交集let intersect = [...new Set([...a].filter(x => b.has(x)))]; [2,3]// 差集let difference = Array.from(new Set([...a].filter(x => !b.has(x)))); [1]
不考虑兼容性,这种去重的方法代码最少。这种方法还无法去掉“{}”空对象,后面的高阶方法会添加去掉重复“{}”的方法。
利用for嵌套for,然后splice去重(ES5中最常用)
var arr = [1, 1, 8, 8, 12, 12, 15, 15, 16, 16];function unlink(arr) {for (var i = 0; i < arr.length; i++) { // 首次遍历数组for (var j = i + 1; j < arr.length; j++) { // 再次遍历数组if (arr[i] == arr[j]) { // 判断连个值是否相等arr.splice(j, 1); // 相等删除后者j--;}}}return arr}console.log(unlink(arr));
Map去重
数组元素包含对象等类型,又该如何去重
let filterRepeatItem = (array: Array<any>) => {let map = new Map()for (let item of array) {if (!map.has(item.valueId)) {map.set(item.valueId, item)}}return [...map.values()]}
数组交集
let arr2 = ['张三', '李四', '王五', '找六', '张三']let arr3 = ['小明', '小红', '王五', '张三']let jiaoji = [...new Set(arr2)].filter(item => arr3.includes(item)) // => ['张三', '王五']// 获取重复项(交集)let getRepeatItem = (arr1: Array<LabelMining>,arr2: Array<LabelMining>) => {const arr2Ids = arr2.map((item) => item.labelId)const repeatArr = arr1.filter((item) => arr2Ids.includes(item.labelId))return repeatArr}
数组是否相同
var a = ["1", "2", "3"];var b = ["3", "2", "1"];/* 用a的第一个元素和b的所有元素从左到右依次进行比较,找到相同元素就将a的这个元素和b的这个元素删除掉,接着用a的第二个元素和b的所有元素从左到右依次比较,相同元素就从a和b中删除掉,去除所有重复项目后,最后看a和b中 有没有多余的元素*/function sameArr(aa, bb) {if (aa.length != bb.length) {return false;}let cc = [...bb];for (let item in aa) {for (let it in cc) {if (aa[item] === cc[it]) {cc.splice(it, 1);}}}return cc.length < 1 ? true : false;}let result = sameArr(a, b);console.log(result);
function copy(value) {return JSON.parse(JSON.stringify(value));}function isArrayEqual(value1 = [], value2 = []) {let hash = copy(value2);if (value1.length === value2.length) {for (let i = 0; i < value1.length; i++) {const index = hash.indexOf(value1[i]);if (index > -1) {hash.splice(index, 1);} else {return false;}}return true;}return false;}console.log(isArrayEqual([1, 2, 3], [2, 1, 3])); // trueconsole.log(isArrayEqual([1, 2], [1, 1])); // false
