array(21种)原型方法实现(push pop unshift shift slice splice reverse sort reduce indexOf find findIndex)

array原型方法实现

push pop unshift shift slice splice reverse sort reduce reduceRight concat join every some filter map indexOf lastIndexOf find findIndex includes

let arr = [0, 1, 2, 3]
let len = arr.push(4); // 返回数组的个数, 改变原数组
// console.log(len) // 5
/**
 * push 实现改变原数组 
 */
const prototype = Array.prototype;
prototype.push1 = function () {
  let len = this.length;
  let args = arguments;
  for (var i = 0; i < args.length; i++) {
    this[len] = args[i];
    len++
  }
  return this.length;
}
// console.log(arr.push1(4)); // 6

let item = arr.pop(); // 返回数组的删除项,改变原数组
// console.log(item);

/**
 * pop
 */
prototype.pop1 = function () {
  let lastItem = this[this.length - 1];
  this.length = this.length - 1;
  return lastItem;
}
// console.log(arr.pop1()); // 3

let len1 = arr.unshift(-1, -2); // 返回数组长度,改变原数组
// console.log(arr, len1)

/**
 * unshift
 */
prototype.unshift1 = function () {
  let args = arguments;
  let len = this.length;
  // 把数组所有项向后移动arguments.length位
  for (var i = len - 1; i >= 0; i--) {
    this[i + args.length] = this[i]
  }
  for (var j = 0; j < args.length; j++) {
    this[j] = args[j]
  }
  return this.length;
}
// console.log(arr, arr.unshift1(-3, -4 ,-5));
let firstItem = arr.shift(); // 返回数组[0]的删除项,改变原数组
// console.log(arr, firstItem)

/**
 * shift
 */
prototype.shift1 = function () {
  let firstItem = this[0];
  let len = this.length;
  // 数组向前移动一位
  for (var i = 0; i < len; i++) {
    this[i] = this[i + 1]
  }
  this.length--;
  return firstItem;
}
// console.log(arr, arr.shift1());

// console.log(arr, arr.slice(1, 3)) // 返回一个新数组,原数组不变
// console.log(arr.slice(undefined, 2)) // 0~2
/**
 * slice
 */
prototype.slice1 = function () {
  let arr = []
  let start = arguments[0] || 0;
  if (start < 0) {
    start = this.length + start;
  }
  let end = arguments[1] || this.length;
  if (end > this.length) {
    end = this.length;
  }
  if (end < 0) {
    end = this.length + end;
  }
  if (start >= end) {
    return arr;
  }
  for (var i = 0; i < this.length; i++) {
    if (i >= start && i < end) {
      arr.push(this[i])
    }
  }
  return arr;
}
// console.log(arr, arr.slice1(1, 3));
// console.log(arr.slice1(0))

// console.log(arr.splice(0, 2, 11, 22)); // 返回删除项,改变原数组
/**
 * splice
 * 第一个参数开始位置
 * 第二个参数删除的个数
 * 第三个参数~第n个参数表示插入的项
 */
prototype.splice1 = function () {
  let start = arguments[0] || 0;
  let deleteNum = arguments[1] || 0;
  let len = this.length;
  // 插入的值
  let add = [];
  for (var i = 2; i < arguments.length; i++) {
    add.push(arguments[i]);
  }
  // 计算删除的结束位置
  let end = start + deleteNum > len ? len : start + deleteNum;
  let deleteItems = this.slice(start, end)
  let newArr = this.slice(0, start);
  let next = this.slice(start + end);
  add.forEach(item => newArr.push(item));
  next.forEach(item => newArr.push(item));
  // this = this.slice(0, start).concat(this.slice(start + end))
  for (var j = 0; j < newArr.length; j++) {
    this[j] = newArr[j]
  }
  return deleteItems;
}
console.log(arr, arr.splice1(0, 1, 33, 44, 55, 12))

// console.log(arr.reverse()); // 翻转数组,改变原数组
/**
 * reverse
 */
prototype.reverse1 = function () {
  let arr = this.slice(0)
  let j = 0;
  for (var i = arr.length - 1; i >= 0; i--) {
    this[j] = arr[i]
    j++
  }
  return this;
}
// console.log(arr.reverse1()); // 翻转数组,改变原数组

// console.log(arr.sort()); // [ 0, 1, 12, 2, 3, 33, 44, 55 ] 排序,改变原数组

/**
 * sort
 * 接收一个回调函数作为参数
 */
let arr1 = [{
  n: 2
}, {
  n: 1
}, {
  n: 11
}, {
  n: 22
}]
let arr2 = [{
  name: 'AAS'
}, {
  name: 'DSF'
}, {
  name: 'FSD'
}, {
  name: 'ABC'
}]
prototype.sort1 = function (callback) {
  for (let i = 0; i < this.length; i++) {
    for (let j = 0; j < this.length - 1 - i; j++) {
      let result;
      if (typeof callback === 'undefined') {
        result = (this[j]).toString() > (this[j + 1]).toString();
      } else if (typeof callback(this[j], this[j + 1]) === 'number') {
        result = callback(this[j], this[j + 1]) > 0;
      } else {
        result = callback(this[j], this[j + 1]);;
      }
      if (result) {
        let temp = this[j];
        this[j] = this[j + 1];
        this[j + 1] = temp;
      }
    }
  }
  return this;

}

// console.log(arr2.sort1(function (a, b) {
//   let val1 = a.name;
//   let val2 = b.name;
//   return val1 < val2;
// }))

/**
 * reduce
 */
prototype.reduce1 = function (callback, init) {
  for (var i = 0; i < this.length; i++) {
    if (init === undefined) {
      init = callback(this[i], this[i + 1], i + 1, this)
      i++;
    } else {
      init = callback(init, this[i], i, this)
    }
  }
  return init;
}
// console.log(arr.reduce1(function(a, b) {
//     return a + b;
// }))
/**
 * reduceRight
 * @param {*} callback 
 * @param {*} init 
 */
prototype.reduceRight1 = function(callback, init) {
  let len = this.length;
  for (var i = len - 1; i >= 0; i--) {
    if (init === undefined) {
      init = callback(this[i], this[i - 1], i - 1, this)
      i--;
    } else {
      init = callback(init, this[i], i, this)
    }
  }
  return init;
}
// let count = arr.reduceRight1((a, b, index) => {
//   console.log(a, index)
//   return a + b;
// })
// console.log(count);

let concat1 = arr.concat([4,6,9], 10, 12) // 返回新数组,不改变原数组
console.log(concat1)

prototype.concat1 = function() {
  let args = arguments;
  let newArr = []
  for (var j = 0; j < this.length; j++) {
    newArr.push(this[j])
    
  }
  for (var i = 0; i < args.length; i++) {
    if (args[i] instanceof Array) {
      for (var k = 0; k < args[i].length; k++) {
        newArr.push(args[i][k])
      }
    } else {
      newArr.push(arr[i]);
    }
  }
  return newArr;
}
// console.log(arr.join(1)) // 返回拼接后的字符串,不改变原数组
/**
 * join
 */
prototype.join1 = function(de) {
  de = de || ',';
  let str = '';
  for (let i = 0;i < this.length; i++) {
    str = str + de + this[i];
  }
  return str.slice(1);
}
// console.log(arr.join1(1));

// console.log(arr.every((item, i) => i > 10)); // 所有值都满足条件返回true, 否则返回false,并终止循环
/**
 * every
 * 接收一个函数作为参数
 */
prototype.every1 = function(callback) {
  let flag = true;
  for (let i = 0; i < this.length; i++) {
    if (!callback(this[i], i, this)) {
      flag = false;
      break;
    }
  }
  return flag;
}
// console.log(arr.every1((item, i) => item >= 0))

// console.log(arr.some(item => item > 10))
/**
 * 
 * @param {*} callback 
 * callback三个参数
 * item ,index ,数组本身
 */
prototype.some1 = function(callback) {
  let flag = false;
  for (let i = 0; i < this.length; i++) {
    if (callback(this[i], i, this)) {
      flag = true;
      break;
    }
  }
  return flag;
}
// console.log(arr.some1(item => item > 100))

// console.log(arr.filter(item => item > 2))

/**
 * 
 * @param {*} callback 
 * item, index, 数组本身
 */
prototype.filter1 = function(callback) {
  let arr = [];
  for (let i = 0; i < this.length; i++) {
    if (callback(this[i], i, this)) {
      arr.push(this[i])
    }
  }
  return arr;
}
// console.log(arr.filter1(item => item > 2))

let m1 = [{age: 1}, {age: 11}, {age: 22}];
// console.log(m1.map(item => item.age));

prototype.map1 = function(callback) {
  let arr = [];
  for (let i = 0; i < this.length; i++) {
    arr.push(callback(this[i], i, this))
  }
  return arr;
}
// console.log(m1.map1(item => item.age))

// console.log(arr.indexOf(2)) // 返回索引,未找到返回-1
/**
 * 
 * @param {*} item 查找项
 * @param {*} n 起始位置
 */
prototype.indexOf1 = function(item, n) {
  let index = -1;
  n = n || 0;
  for (let i = n; i < this.length; i++) {
    if (item === this[i]) {
      index = i
      break
    }
  }
  return index;
}
// console.log(arr.indexOf1(2, 7))

prototype.lastIndexOf1 = function(item, n) {
  let index = -1;
  n = n || this.length - 1;
  if (n >= this.length) {
    n = this.length - 1;
  }
  if (n < 0 && Math.abs(n) > this.length) {
    return index;
  }
  for (let i = n; i >= 0; i--) {
    if (item === this[i]) {
      index = i;
    }
  }
  return index;
}
console.log(arr.lastIndexOf1(2));
// console.log(m1.find(item => item.age === 11));
/**
 * 
 * @param {*} callback 回调函数
 */
prototype.find1 = function(callback) {
  let result;
  for (let i = 0; i < this.length; i++) {
    if (callback(this[i], i, this)) {
      result = this[i]
      break;
    }
  }
  return result;
}
// console.log(m1.find1(item => item.age === 223));

// console.log(m1.findIndex(item => item.age === 223)); // 接收函数作为参数返回索引
/**
 * 
 * @param {*} callback
 */
prototype.findIndex1 = function(callback) {
  let index = -1;
  for (let i = 0; i < this.length; i++) {
    if (callback(this[i], i, this)) {
      index = i;
      break;
    }
  }
  return index;
}

// console.log(m1.findIndex1(item => item.age === 11));

console.log(m1.includes(11));

prototype.includes1 = function(item, n) {
  let flag = false;
  n = (n || 0) < 0 ? n + this.length : (n || 0)
  for (let i = n; i < this.length; i++) {
    if (item === this[i]) {
      flag = true;
    }
  }
  return flag;
}
console.log(arr.includes1(2));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值