JS 数组常见操作总结

141 阅读1分钟

数组展开

  • 常规版
function flatten(arr) {
  let res = [];
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) res = res.concat(flatten(arr[i]));
    else res.push(arr[i]);
  }
  return res;
}
  • reduce 版
function flatten(arr) {
  return arr.reduce((acc, cur) => {
    return Array.isArray(cur) ? acc.concat(flatten(cur)) : acc.concat(cur);
  }, []);
}
  • 指定深度版
function flattenByDeep(arr, deep) {
  deep = deep || 1;
  let res = [];
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i]) && deep > 1) {
      res = res.concat(flattenByDeep(arr[i], deep - 1));
    } else res = res.concat(arr[i]);
  }
  return res;
}

数组乱序

function flush(arr) {
  for (let i = 0; i < arr.length; i++) {
    // Math.floor([0,1)*size) => [0,size-1]
    let index = Math.floor(Math.random() * arr.length);
    [arr[i], arr[index]] = [arr[index], arr[i]];
  }
}

数组去重

[1,2,2,3] => [1,2,3]

  • 创造一个对象标记元素是否出现过
function unique(arr) {
  let container = {};
  return arr.filter(item => {
    if (container.hasOwnProperty(item)) {
      return false;
    }
    container[item] = true;
    return true;
  });
  • 利用 indexOf()
function unique(arr) {
  return arr.filter((e, i) => arr.indexOf(e) === i);
}
  • 利用 Set()
const unique = arr => Array.from(new Set(arr));

const unique = arr => [...new Set(arr)];

数组去重2 去除所有重复的值

利用 indexOf() 和 lastIndexOf(); indexOf() 从头开始搜索,lastIndexOf() 从尾部开始搜索

function unique(arr) {
  return arr.filter(e => arr.indexOf(e) === arr.lastIndexOf(e));
}

手写 reduce

Array.prototype.reduce = function (fn, init) {
  let acc = init || this[0];
  let start = init ? 0 : 1;
  for (let i = start; i < this.length; i++) {
    acc = fn(acc, this[i], i, this);
  }
  return acc;
};