Array操作符手写实现

2019-06-14  本文已影响0人  琢磨先生lf

注意:不能使用箭头函数

some

使用示例

const arr = [1,2,3,4];
arr.some(item => item === 0); // false
arr.some(item => item === 1); // true
Array.prototype._some = function(cb) {
  let res = false;
  for (let i=0; i<this.length; i++) {
    res = cb(this[i]);
    if (res) return true;
  }
  return res;
}

every

Array.prototype._every = function(cb) {
  let res = true;
  for (let i=0; i<this.length; i++) {
    res = cb(this[i]);
    if (!res) return false;
  }
  return res;
}

find

使用示例

const characters = [
  { id: 1, name: 'ironman' },
  { id: 2, name: 'black_widow' },
  { id: 3, name: 'captain_america' },
  { id: 4, name: 'captain_america' },
];
function getCharacter(name) {
  return character => character.name === name;
}
const res = characters._find(getCharacter('captain_america'));
// {id: 4, name: "captain_america"}

Array.prototype._find = function(cb) {
  let res;
  for (let i=0; i<this.length; i++) {
    const item = this[i];
    if (cb(item)) {
      res = item;
    }
  }
  return res;
}

filter

使用示例

const fArr = characters._filter(item => {
  return item.id > 1;
});
// [ {id: 3, name: "captain_america"}, {id: 4, name: "captain_america"}]

Array.prototype._filter = function(cb) {
  const resArr = [];
  for (let i=0; i<this.length; i++) {
    const item = this[i];
    if (cb(item)) {
      resArr.push(item);
    }
  }
  return resArr;
}

reduce

使用示例

const arr = [1,2,3,4];
arr.reduce((result, cur) => {
  console.log(result);
  return cur;
}, 0);
// 0 1 2 3 4
Array.prototype._reduce = function (callback, initVal) {
  let i = 0
  let result = initVal
  if (initVal === undefined || initVal === null) {
    result = this[0]
    i++
  }
  for (i; i < this.length; i++) {
    result = callback(result, this[i])
  }
  return result
}

// 测试
const arr = [1, 2, 3]
let result = arr._reduce((a, b) => {
  return a + b
}, 0)
console.log(result) // 6
上一篇下一篇

猜你喜欢

热点阅读