数组相关的手写代码

121 阅读1分钟

1、数组去重

const unique1 = function(arr) {
  if(!Array.isArray(arr)) {
    console.log('type error')
    return;
  }

  return [...new Set(arr)];
}

// 通过indexOf
const unique2 = function(arr) {
  if(!Array.isArray(arr)) {
    console.log('type error');
    return
  }

  let list = [];
  arr.length && arr.map(item => {
    if(list.indexOf(item) == -1) {
      list.push(item);
    }
  });

  return list
}

// 通过obj
const unique3 = function(arr) {
  if(!Array.isArray(arr)) {
    console.log('type error');
    return;
  }

  let obj = {};
  let list = [];
  arr.length && arr.map(item => {
    if(!obj[item]) {
      list.push(item)
      obj[item] = 1;
    } 
  });

  return list;
}

2、数组排序

// 冒泡排序
let bubbleSort = function(arr) {
  let len = arr.length;
  for(let i = len; i > 1; i--) {
    for(j = 0; j < i-1; j++) {
      if(arr[j] > arr[j+1]) {
        let temp = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = temp; 
      }
    }
  }

  return arr;
}

// ES6优化一下
let bubbleSort = function(arr) {
  let len = arr.length;
  for(let i = len; i > 1; i--) {
    for(j = 0; j < i-1; j++) {
      if(arr[j] > arr[j+1]) {
        [arr[j], arr[j+1]] = [arr[j+1], arr[j]];
      }
    }
  }

  return arr;
}

bubbleSort([3,1,2,5,6,4])

// 快速排序
let quickSort = function(arr) {
  if(arr.length < 2) {
    return arr;
  }

  let left = [],right = [], cur = arr.splice(0,1);
  let len = arr.length;
  for(let i = 0; i < len; i++) {
    if(arr[i] < cur) {
      left.push(arr[i]);
    } else {
      right.push(arr[i]);
    }
  }

  return quickSort(left).concat(cur, quickSort(right));
}

quickSort([3,1,2,5,6,4])

// 选择排序
let selectSort = function(arr) {
  let len = arr.length;
  for(let i = 0; i < len; i++) {
    for(let j = i; j < len; j++) {
      if(arr[j] < arr[i]){
        [arr[i], arr[j]] = [arr[j],arr[i]];
      }
    }
  }

  return arr
}
selectSort([3,1,2,5,6,4])
class SubPub {
    constructor() {
        this._observer = {};
    }
    // 订阅
    subscribe(name, callback) {
        if(!isFunction(callback)) return;
        if(!this._observer[name]) this._observer[name] = [];
        this._observer[name].push(callback);

        return this;
    }

    // 发布
    publish() {
        const self = this;
        const args = [...arguments];
        const name = args[0]; // 因为arguments不是数组,是一种类数组类型,所以没有shift、slice这些方法
        //发布的内容
        const content = args.slice(1);

        const list = this._observer[name];
        if(!list || !list.length) return;

        list.map(item => {
            item.apply(self, content);
        })

        return self;
    }

    // 取消订阅
    removeSub(name, callback) {
        let list = this._observer[name];
        if(!list || !list.length) return;

        list.map((item, index) => {
            if(item === callback) {
                list.splice(index,1);
            }
        })

        return this;
    }
}
function isFunction(val) {
    return Object.prototype.toString.call(val).slice(8,-1).toLocaleLowerCase() == 'function';
}
const sb = new SubPub();

const abcFn = function(data) {
    console.log('abc' + data);
}

const qweFn = function(data) {
    console.log('qwe' + data);
}

sb.subscribe('tap', abcFn);
sb.subscribe('tap', qweFn);

sb.publish('tap');