Js 数组操作集合

以下为笔者练习总结

二分查找

function bsearch(arr, val) {
  var arr =[].concat(arr),
    low = 0,
    high = arr.length - 1

  while(low <= high){
    var mid = Math.floor(low + (high - low) / 2)//防止high+low超出上限

    if(val === arr[mid]){
      return  mid
    }else if(val > arr[mid]){
      low = mid + 1
    }else if(val < arr[mid]){
      high = mid -1
    }
  }
  return -1
}

 

数组全排列

function permutate(str) {
    var result=[];
    if(str.length===1){
        return [str]    
    }else{
        var preResult=permutate(str.slice(1));
        for (var j = 0; j < preResult.length; j++) {
            for (var k = 0; k < preResult[j].length+1; k++) {
                var temp=preResult[j].slice(0,k)+str[0]+preResult[j].slice(k)   
               result.push(temp)  
            }
        }
        return result
    }     
}    

 

去重

let a=["1",1,2,3,5,4,2,4,1,6];

[...(new Set(a))]; //["1", 1, 2, 3, 5, 4, 6]

Array.from(new Set(a));  //["1", 1, 2, 3, 5, 4, 6]

function unique(arr){
    let temp={},result=[];
    arr.concat().forEach(item=>{
        if(!temp[typeof(item)+item]){
            result.push(item);
            temp[typeof(item)+item]=1;
        } 
    })
    return result
}
unique(a); //["1", 1, 2, 3, 5, 4, 6]

寻找重复次数最多或最少的元素

let a=[1,2,3,2,4,5];

console.log(max(a)); //2
console.log(min(a)); //1

function max(arr) {
    let temp = {},max=arr[0];

    for (let i=0,l=arr.length;i<l;i++) {
        if (!temp[arr[i]]) {
            temp[arr[i]] = 1;
        } else {
            temp[arr[i]]++;
        }
    }
    for(let x in temp){
        max=temp[x]>temp[max]?x:max;
    }
    return max
}

function min(arr) {
    let temp = {},min=arr[0];

    for (let i=0,l=arr.length;i<l;i++) {
        if (!temp[arr[i]]) {
            temp[arr[i]] = 1;
        } else {
            temp[arr[i]]++;
        }
    }
    for(let x in temp){
        min=temp[x]<temp[min]?x:min;
    }
    return min
}

寻找第一个未重复的元素

let a=[1,2,3,4,3,2,1,5];

function get(arr){
    let result=[],temp=arr.concat();
    temp.forEach(item=>{
        if(temp.indexOf(item)===temp.lastIndexOf(item)) result.push(item);
    });
    return result[0];
}

get(a); //4

寻找两数组最小的相同元素

let a=[1,5,2,3],b=[3,2,4,1];

function get(arr1,arr2){
        let a1= arr1.concat().sort((a,b)=>a-b),
             a2 = arr2.concat().sort((a,b)=>a-b),
         s=new Set(a2);
    return a1.filter(item=>s.has(item)).sort((a,b)=>a-b)[0];
}

get(a,b); //1

展开多维数组

let arr = [1,2,[3],4,[5,[6]]];

function get(arr) {
    for (let i in arr) {
        if (Array.isArray(arr[i])) {
            arr.splice(i, 1, ...get(arr[i]));
        }
    }
    return arr
}

get(arr);  //[1,2,3,4,5,6]

差集、交集

let a=[1,2,3,5],b=[1,2,5],s=new Set(b);

//差集
a.filter(item=>!s.has(item)); 
//[3]

//交集
a.filter(item=>s.has(item)); 
//[1,2,5]

 

posted @ 2018-04-06 16:12  莫非王臣  阅读(4329)  评论(0编辑  收藏  举报