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('');
}