数组置空
let arr = [1,2,3]
arr = []
//只是改变引用地址,数组先前的内容依旧保存在内存中,当数据量比较大时,可以会造成内存泄漏
let arr = [1,2,3]
arr.length = 0
//可以彻底清空arr数据的内容
注意:通过arr.length
清空数组,需要注意当一个数组赋值给多个变量时,多个变量指向同一个数组的引用地址,那么清空一个变量,会导致其他变量也为空,所以在初始赋值时可以使用深拷贝规避下这个问题。
数组去重
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])); // true
console.log(isArrayEqual([1, 2], [1, 1])); // false