排序,递归,深拷贝

举例

let arr = [23, 2, 14, 7, 30, 4];

基本排序

  • 冒泡排序
function bubleSort(arr) {
  for (let i = arr.length; i >= 2; i--) {
    for (let j = 0; j <= i - 2; j++) {
      if (arr[j] > arr[j + 1]) {
        // let temp = arr[j];
        // arr[j] = arr[j+1];
        // arr[j+1] = temp;
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; // //ES6解构赋值
      }
    }
  }
  return arr;
}
  • 选择排序

    将第一个元素和其他元素作比较,检查完所有的元素后,最小的放在第一个位置,接下来再开始从第二个元素开始,重复以上一直到最后。

function selectSort(arr) {
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = i; j < arr.length; j++) {
      if (arr[i] > arr[j]) {
        [arr[i], arr[j]] = [arr[j], arr[i]];
      }
    }
  }
  return arr;
}
  • 插入排序
    就想着自己在打扑克牌,接起来一张,放哪里无所谓,再接起来一张,比第一张小,放左边,继续接,可能是中间数,就插在中间…依次
function insertSort(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i; j > 0; j--) {
      if (arr[j] < arr[j - 1]) {
        [arr[j - 1], arr[j]] = [arr[j], arr[j - 1]];
      }
    }
  }
  return arr;
}
console.log("冒泡排序", bubleSort(arr));
console.log("选择排序", selectSort(arr));
console.log("插入排序", insertSort(arr));
  • 高级排序
function quickSort(arr) {
  if (arr.length <= 1) {
    return arr; //递归出口
  }
  var left = [],
    right = [],
    current = arr.splice(0, 1); //注意splice后,数组长度少了一个

  for (let i = 0; i < arr.length; i++) {
    if (arr[i] < current) {
      left.push(arr[i]); //放在左边
    } else {
      right.push(arr[i]); //放在右边
    }
  }
  return quickSort(left).concat(current, quickSort(right)); //递归
}
console.log("高级排序之快速排序", quickSort(arr));

深拷贝 Deep Clone

  • 实现对一个对象(object)的深度克隆
    所谓深度克隆,就是当对象的某个属性值为object或array的时候,要获得一份copy,而不是直接拿到引用值
function deepClone(origin, target) {
  var target = target || {};
  for (var key in origin) {
    if (origin.hasOwnProperty(key)) {
      if (Array.isArray(origin[key])) {
        target[key] = [];
        deepClone(origin[key], target[key]);
      } else if (typeof origin[key] === "object" && origin[key] !== null) {
        target[key] = {};
        deepClone(origin[key], target[key]);
      }
      target[key] = origin[key];
    }
  }
  return target;
}
let obj = {
  name: 12,
  pets: [{ name: "dog" }, { name: "cat" }],
  hobby: { type: "running" }
};
console.log(deepClone(obj));

递归

  • Array数组的flat方法实现
var arr1 = [1, [2], [[2, 3], [2]], 3, 4];
Array.prototype.flat = function() {
  var arr = [];
  this.forEach(function(item, idx) {
    if (Array.isArray(item)) {
      arr = arr.concat(item.flat());
    } else {
      arr.push(item);
    }
  });
  return arr;
};
console.log(arr1.flat());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值