数组排序,求和,去重,合并

323 阅读1分钟

一、数组排序方法 冒泡排序

function bubble(arr) {
			//外层循环i控制比较轮数
			let temp = null
			for (let i = 0; i < arr.length - 1; i++) {
				//里层循环控制每一轮比较次数
				for (let j = 0; j < arr.length - 1 - i; j++) {
					if (arr[j] > arr[j + 1]) {
						//当前项大于后一项
						temp = arr[j]//交换位置
						arr[j] = arr[j + 1]
						arr[j + 1] = temp
					}
				}
			}
			return(arr)
		}
		bubble(arr)

插入排序

//插入排序
		
		function insert(arr){
			//准备一个新数组,用来储存插入的第一个值
			let handle = []
			handle.push(arr[0])
			for (let i = 1; i < arr.length; i++) {
				let a = arr[i]
				//和handle数组里的值依次比较,从后往前比较
				for(let j =handle.length-1;j>=0;j--){
					//每一次比较数组的值
					let b = handle[j]
					//当前的a值比b值大,放到后面
					if(a>b){
						handle.splice(j+1,0,a)
						break;
					}
					if(j===0){
						handle.unshift(a)
					}
				}
			}
			return handle
		}
		insert(arr)

快速排序

//快速排序
		function quick(arr){
			if(arr.length<=0){
				return arr
			}
			//找到数组中间项,在原数组把他移除
			let middle = Math.floor(arr.length/2);
			let midvalue = arr.splice(middle,1)[0]
			//准备左右两个数组,循环剩下数组每一项,比当前小放左边,比当前大放右边
			let arrleft=[]
			let arrright = []
			for (let i = 0; i < arr.length; i++) {
				let item = arr[i]
				item<midvalue?arrleft.push(item):arrright.push(item);
			}
			//递归方式让左右两边数组持续这样处理,一直两边都排好序为止
			return quick(arrleft).concat(midvalue,quick(arrright))
		}
		quick(arr)

二、数组求和

//递归
function sum(arr) {
    var len = arr.length;
    if(len == 0){
        return 0;
    } else if (len == 1){
        return arr[0];
    } else {
        return arr[0] + sum(arr.slice(1));
    }
}
//for 循环
function sum(arr) {
    var s = 0;
    for (var i=arr.length-1; i>=0; i--) {
        s += arr[i];
    }
    return s;
}
//forEach遍历
function sum(arr) {
    var s = 0;
    arr.forEach(function(val, idx, arr) {
        s += val;
    }, 0);
  
    return s;
};
//eval
function sum(arr) {
    return eval(arr.join("+"));
};

三、数组去重

function dedup(arr){
			for (let i = 0; i < arr.length; i++) {
				for (let j =i+1; j < arr.length; j++) {
					if(arr[i]==arr[j]){
						arr.splice(j,1)
						j--
					}
				}
			}
			return arr
		}
		console.log(dedup(arr))

四、数组合并

//concat 合并
var a = [1,2,3];
var b = [4,5,6];
var c = a.concat(b)//c=[1,2,3,4,5,6];
//for循环
for( var i in b)
		{
		  a.push(b[i]);
		}
		console.log(a)
        
//多维数组转一维数组
 /** 
     * 使用转字符串法
     */
    let arr = [1,[2,3],[4,5,[6,7]]];
    let result = arr.join(',').split(',');
    console.log(result); //  ["1", "2", "3", "4", "5", "6", "7"]
     // 可以使用循环改进
    function unid(arr){
        let result = arr.join(',').split(',');
        let result2 = result.map(item=>{
            return Number(item);
        });
        return result2;
    }
    console.log(unid(arr)); // [1, 2, 3, 4, 5, 6, 7]
    
 // 数组的concat方法
  
  let tempArr2 = ['3',4],
  tempArr3 = ['3',4,[5,6]];
  console.log([1,2].concat(tempArr2)); // [1, 2, "3", 4]
  concat 只能二维数组转一维数组
  
   // 方法三:使用递归来实现多维数组转为一维数组
    let result = [],
        arr = ['1',2,[3,4,[5,6]],7];
    function unid(arr){
        for(let item of arr){
            if(Object.prototype.toString.call(item).slice(8, -1)==='Array'){
                unid(item);
            }else{
                result.push(item);
            }
        }
        return result;
    }
    console.log(unid(arr)); // ["1", 2, 3, 4, 5, 6, 7]