14.实现数组方法合集

实现数组方法flat

// 实现1
var flat1 = (arr, number = 10) => {
  let result = [],count = 0;

  var helper = (arr) => {
    let res = [];
    count++;
    for (let item of arr) {
      if (Array.isArray(item)) {
        if (count === number) {
          break;
        }
        res = res.concat(helper(item));
      } else {
        res.push(item);
      }
    }
    return res;
  };

  result = result.concat(helper(arr));

  return result;
};

// 实现2
var flat2 = (arr) => {
  return arr.reduce((pre, cur) => {
    return pre.concat(Array.isArray(cur) ? flat2(cur) : cur);
  }, []);
};

实现数组去重

// 实现1
var unique1 = (arr) => {
  return [...new Set(arr)];
};

// 实现2
var unique2 = (arr) => {
  let result = [];
  for (let i = 0; i < arr.length; i++) {
    if (result.indexOf(arr[i]) === -1) {
      result.push(arr[i]);
    }
  }
  return result;
};

// 实现3
var unique3 = (arr) => {
  arr.sort();
  let result = [arr[0]];
  for (let i = 1; i < arr.length; i++) {
    if (arr[i] !== result[result.length - 1]) {
      result.push(arr[i]);
    }
  }
  return result;
};

// 实现4
var unique4 = (arr) => {
  const map = {};
  if (arr && Array.isArray(arr)) {
    for (let i = arr.length - 1; i >= 0; --i) {
      if (arr[i] in map) {
        arr.splice(i, 1);
      } else {
        map[arr[i]] = true;
      }
    }
  }
  return arr;
};

实现数组filter

Array.prototype._filter = function (fn) {
  let result = [];

  for (let i = 0; i < this.length; i++) {
    if (fn(this[i], i, this)) {
      result.push(this[i]);
    }
  }

  return result;
};

测试:

var nums = [4,8,9,10];
console.log(nums.filter((n) => n > 8)); // [9,10]

console.log(nums._filter((n) => n > 8)); // [9,10]

语法:

var newArray = arr.filter(callback(element[, index[, array]])[, thisArg])

实现数组reduce

Array.prototype._reduce = function (callback, initial) {
  let i = 0;
  let acc = initial === undefined ? this[i++] : initial;

  for (; i < this.length; i++) {
    acc = callback(acc, this[i], i, this);
  }
  return acc;
};

测试:

console.log([1, 2, 3].reduce((acc, cur) => acc + cur)); // 6
console.log([1, 2, 3].reduce((acc, cur) => acc + cur, 10)); // 16

console.log([1, 2, 3]._reduce((acc, cur) => acc + cur)); // 6
console.log([1, 2, 3]._reduce((acc, cur) => acc + cur, 10)); // 16

语法:

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

实现数组交集

// 实现1:filter实现
var intersect1 = (a, b) => a.filter((x) => b.indexOf(x) > -1);

// 实现2:Set实现
var intersect2 = (a,b) => a.filter(x => new Set(b).has(x));

测试:

intersect1([1, 2], [2, 3]); //[2]
intersect2([1, 2, 3], [2, 3, 4]); //[2, 3]

实现数组并集

// 实现1:filter + concat实现
var union1 = (a, b) => a.concat(b.filter((x) => !(a.indexOf(x) > -1)));

// 实现2:Set实现
var union2 = (a, b) => [...new Set([...a, ...b])];

测试:

union1([1, 2], [2, 3]); //[1,2,3]
union2([1, 2, 3], [2, 3, 4]); //[1,2,3,4]

More

Array
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array

Array.prototype.filter()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

Array.prototype.reduce()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

Array.prototype.flat()
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat