// 双层循环 functionunique1(arr) { var res = [] for (var i = 0, arrLen = arr.length; i < arrLen; i++) { for (var j = 0, resLen = res.length; j < resLen; j++) { if (arr[i] === res[j]) { break } } // 如果array[i]是唯一的,那么执行完循环,j等于resLen if (j === resLen) { res.push(arr[i]) } } return res }
// indexOf functionunique2(arr) { var res = [] for (var i = 0, arrLen = arr.length; i < arrLen; i++) { if (res.indexOf(arr[i]) === -1) { res.push(arr[i]) } } return res }
// 排序后去重 functionunique3(arr) { var res = [] var sortedArr = arr.concat().sort() var seen for (var i = 0, arrLen = sortedArr.length; i < arrLen; i++) { // 如果是第一个元素或者相邻的元素不相同 if (i === 0 || seen !== sortedArr[i]) { res.push(sortedArr[i]) } seen = sortedArr[i] } return res }
// filter中with indexOf functionunique4(arr) { var res = arr.filter(function(item, index, array) { return array.indexOf(item) === index }) return res }
// filter中with 排序后去重 functionunique5(arr) { var res = arr .concat() .sort() .filter(function(item, index, array) { return index === 0 || item !== array[index - 1] }) return res }
// Object键值对(对象去重) functionunique6(arr) { var res = [] var obj = {} for (var i = 0, arrLen = arr.length; i < arrLen; i++) { var item = arr[i] // 因为对象的键值对只能是字符串,防止1和'1'的情况,所以采取一个typeof加类型的方法来区分 // 然而还是无法区分两个对象,比如 {value: 1} 和 {value: 2},因为 typeof item + item 的结果都会是 object[object Object] // 所以我们可以使用 JSON.stringify 将对象序列化转化成字符串 if (!obj[typeof item + JSON.stringify(item)]) { obj[typeof item + JSON.stringify(item)] = true res.push(item) } } return res }