🎶 Sym - 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台

📕 思源笔记 - 一款桌面端笔记应用,支持 Windows、Mac 和 Linux

🎸 Solo - B3log 分布式社区的博客端节点,欢迎加入下一代社区网络

♏ Vditor - 一款浏览器端的 Markdown 编辑器

Array - pullBy (advanced)

2019-05-28

描述

基于给定的迭代函数和对象获取出需要过滤值,最终根据需要过滤出的值来修改原始数组。

提示

  • 检查提供给函数中的最后一个参数是否为函数,如果不是函数的话返回 undefined
  • 使用 Array.prototype.map() 让指定的所有数组中的对象依次传入迭代函数 fn 中,从而获取需要过滤出的值
  • 使用 Array.prototype.filter() 和 Array.prototype.includes() 过滤出不需要的值
  • 通过使用 Array.prototype.length = 0 将原始数组的长度重置为 0,从而改变其传入的数组
  • 使用 Array.prototype.push() 为原始数组重新填入过滤后的值

代码

const pullBy = (arr, ...args) => {
  const length = args.length;
  let fn = length > 1 ? args[length - 1] : undefined;
  fn = typeof fn == 'function' ? (args.pop(), fn) : undefined;
  let argState = (Array.isArray(args[0]) ? args[0] : args).map(val => fn(val));
  let pulled = arr.filter((v, i) => !argState.includes(fn(v)));
  arr.length = 0;
  pulled.forEach(v => arr.push(v));
};

示例

移除原始数组中 x 不等于指定数组中的 x 的元素:

var myArray = [{ x: 1 }, { x: 2 }, { x: 3 }, { x: 1 }];
pullBy(myArray, [{ x: 1 }, { x: 3 }], o => o.x); // myArray = [{ x: 2 }]

返回总目录

每天 30 秒系列之 JavaScript 代码


欢迎注册黑客派社区,开启你的博客之旅。让学习和分享成为一种习惯!

留下你的脚步