1.数组去重
只讨论两种,当然方法很多。
A: 最简单实现
思路:定义一个新的空数组 n,利用 indexOf 判断, 遍历数组 arr ,如果 arr[i] 已经存在于 n 数组内,不添加;否则就将 arr[i] 添加到数组 n 中, 最后返回数组 n
function unique(arr) {
var n = [];
for (var i = 0; i < arr.length; i ++) {
if (n.indexOf(arr[i]) == -1){
n.push(arr[i])
}
}
return n;
}
试着运行下:
console.log(unique([NaN,2,NaN, 3, 2, 4, 4, 5,6]));
得到的结果为: [NaN, 2, NaN, 3, 4, 5, 6]
对于NaN就会出现错误
B:利用Object对象不存在相同属性名特性进行去重
思路:新建一个空数组 n 存放结果。并新建一个空对象 json ,循环遍历数组,把数组的每个元素作为空对象 json的属性名(键),属性值(值)可以随便定。循环遍历的时候,检查 json[arr[i]] 属性是否已经存在,若存在, 表示此项 arr[i]为重复元素;如果不存在,就将 arr[i]这个值存入数组 n 中。最后返回 数组 n
function unique1(arr) {
var n = [];
var json = {};
for (var i = 0; i < arr.length; i ++) {
if (!json[arr[i]]) {
n.push(arr[i]);
json[arr[i]] = 2;
}
}
return n;
}
试着运行下:
console.log(unique1([NaN,2,NaN, 3, 2, 4, 4, 5,6]));
得到结果为: [NaN, 2, 3, 4, 5, 6]
2.快速排序
使用递归对数组进行快速排序:
思路:1.选一个基准项,midNum,
2.定义两个空数组来临时存放结果: left = [ ], right = [ ];
3.遍历数组中的元素,每个元素与 基准项 midNum 对比,小于基准值的 元素放入数组 left 中,大于基准项的放入数组 right 中;
4.然后使用递归不断的重复上面过程,直到最后得出结果。
function quickSort(arr) {
if (arr.length < 2) {
return arr
}
var midIndex = Math.floor(arr.length / 2);
var midNum = arr.splice(midIndex, 1);
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++) {
if (arr[i] < midNum) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return quickSort(left).concat([midNum], quickSort(right))
}
尝试运行:
var arr = [2, 4, 3, 4, 6, 3, 2, 5, 6, 2, 3, 6, 5, 4]
alert(quickSort(arr))
得到结果为: