JavaScript数组去重算法实例

JavaScript数组去重算法实例

总结分析了JavaScript数组去重相关的读写、遍历、比较、排序等操作及算法改进相关实现技巧。
例:

arr = ["1",3,"1",1,4,5,1,"2",5,1,{"name":"li","age":20},2,4,3,{"name":"li","age":20},""];

方法一:借助于临时数组与indexOf , 算法复杂度为:O(n^2)

function unique1(arr){
    var temp = []; //临时数组
    for(var i=0; i<arr.length; i++){
        if(temp.indexOf(arr[i]) == -1){
            temp.push(arr[i]);
        }
    }
    return temp;
}

结果:(bug 无法区分对象)unique1(arr) : ["1", 3, 1, 4, 5, "2", Object { name="li", age=20}, 2, Object { name="li", age=20}, ""]

方法二 : 用JavaScript中的Object对象来当作hash表

function unique2(arr){
    var temp=[];
    var hash={};
    for(var i=0; i<arr.length;i++){
        var item = arr[i];
        var key = typeof(item)+item;
        if(!hash[key]){
            hash[key]=true;
            temp.push(arr[i]);
        }
    }
    return temp;
}

结果:unique2(arr) : ["1", 3, 1, 4, 5, "2", Object { name="li", age=20}, 2, ""]

方法三:先用sort对数组排序,然后借助临时数组,存储相同元素的最后一个,该方法只能用于纯Number类型数组

function unique3(arr){
    arr.sort(function(a,b){
        return a-b;
    }); //排序
    var temp = [];
    for(var i=0;i<arr.length;i++){
        if(arr[i] !== arr[i+1]){
            temp.push(arr[i]);
        }
    }
    return temp;
}

 使用 forEach 删除重复项

function removeDuplicates(arr) { 
    const uniqueVals = []; 
    arr.forEach((value,index) => { 
        if(uniqueVals.indexOf(value) === -1) {
            uniqueVals.push(value);
        } 
    });
    return uniqueVals;
}

使用 filter 删除重复项

function removeDuplicates(arr) {
    return arr.filter((item, pos) => arr.indexOf(item) === pos)
}

使用 Set 删除重复项

Set 仅允许存在唯一值,所以当你传入数组时,它会自动删除重复的值。
function removeDuplicates(arr) {
    return [...new Set(arr)];
}

写一个函数,向该函数传入一组非负整数,其中的值各不不同,要求使它们连续,并返回缺失的数字个数。

const arr = [4,2,6,8]

使用 sort 和 for 循环解决

function countMissingNumbers(arr) {
    arr.sort((a,b) => a-b); 
    let count = 0; 
    const min = arr[0]; 
    const max = arr[arr.length-1];
    for (i = min; i<max; i++) {
        if (arr.indexOf(i) === -1) {
            count++; 
        } 
    } 
    return count;
}
console.log(countMissingNumbers(arr));

使用 Math.max 和 Math.min 求解

function countMissingNumbers(arr) {
    return Math.max(...arr) - Math.min(...arr) + 1 - arr.length;
}

3. 检查字符串是否为回文。所谓 回文 是一个从左到右和从右到左读起来都一样的字符串。

使用 for 循环检查

function checkPalindrome(inputString) { 
    let length = inputString.length
    for (let i =0; i<length / 2; i++) {
        if (inputString[i] !== inputString[length - 1 -i]) {
            return false 
        }
    }
    return true
}

用 reverse 和 join 检查

function checkPalindrome(string) {
    return string === [...string].reverse().join('');
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值