18个项目必备的JavaScript代码片段——数组篇

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以加我微信 ruochuan12 参与,目前近3000人参与,0-5年工作经验的都可以参与学习。

1.chunk转换二维数组

将数组(array)拆分成多个数组,并将这些拆分的多个数组组成一个新数组。

function chunk(array, count = 1) {let pages = []array.forEach((item, index) => {const page = Math.floor(index / count)if (!pages[page]) pages[page] = []pages[page].push(item)})return pages
}

小栗子

chunk([1, 2, 3, 4, 5, 6, 7], 2)
=> [[1, 2], [3, 4], [5, 6], [7]]chunk(['a', 'b', 'c', 'd'], 3)
=> [['a', 'b', 'c'], ['d']]

2.cloneArray克隆数组

浅拷贝一份数组副本。

// ES6 ...
const cloneArray = arr => [...arr]// ES6 Array.from
const cloneArray = arr => Array.from(arr)// concat()
const cloneArray = arr => [].concat(arr)// map()
const cloneArray = arr => arr.map(x => x)cloneArray([1, 24]) // [1, 24]

小栗子

cloneArray([1, 24])
// => [1, 24]

3.compact去除数组中的无效值

创建一个新数组,包含原数组中所有的非假值元素。例如false, null,0, "", undefined, 和 NaN 都是被认为是“假值”。

const compact = arr => arr.filter(Boolean)

小栗子

min([0, 1, false, 2, '', 3])
// => [1, 2, 3]

4.difference 数组差集

创建一个具有唯一array值的数组,每个值不包含在其他给定的数组中。

假设有 AB 两个数组,返回 A 数组中的集合不包含 B 数组中的集合。

const difference = (a, b) => {const s = new Set(b)let arr = a.filter(x => !s.has(x))return arr
}

小栗子

difference([1, 2, 6, 7], [1, 2, 9, 5])
// => [ 6, 7 ]

5.intersection数组集合

创建一个共有的array值的数组,每个值包含在其他给定的数组中。

const intersection = (a, b) => {const s = new Set(b)return a.filter(x => s.has(x))
}
// ES6 includes
const intersection = (arr, values) => arr.filter(v => values.includes(v))

小栗子

intersection([1, 2, 6, 7], [1, 2, 9, 5])
// => [ 1, 2 ]

6.flatten扁平化数组

将多层嵌套数组(array)拆分成一个数组。

// 扁平化  Map 方法
const flatten = arr => [].concat(...arr.map(v => (Array.isArray(v) ? flatten(v) : v)))// 扁平化  reduce 方法
const flatten = arr => arr.reduce((a, c) => a.concat(Array.isArray(c) ? flatten(c) : c), [])

小栗子

flatten([1, [2], [3], [4, 5]])=> [1, 2, 3, 4, 5]

7.flattenDeep指定层级扁平化数组

将多层嵌套数组(array)拆分成指定层级数组。

const flattenDeep = (arr, depth = 1) => arr.reduce((a, v) => a.concat(depth > 1 && Array.isArray(v) ? flatten(v, depth - 1) : v), [])// ES6方法 `flat(depth)`
[1, [2, [3, [4]], 5]].flat(1)
// => [1, 2, [3, [4]], 5]

小栗子

flattenDeep([1, [2, [3, [4]], 5]], 1)
// => [1, 2, [3, [4]], 5]

8.isArrayEqual检查两个数组各项相等

比较两个数组内的各项值是否相等,返回一个Boolean值。

const isArrayEqual = (a, b, has = true) => {if (a.length !== b.length) return (has = false)const s = new Set(b)if (a.find(x => !s.has(x))) return (has = false)return has
}

小栗子

isArrayEqual([6, 5, 2, 4, 1, 3], [1, 2, 3, 4, 5, 6])
// => trueisArrayEqual([6, 5, 2, 7, 1, 3], [1, 2, 3, 4, 5, 6])
// => false

9.max数组中最大值

过滤原数组中所有的非假值元素,返回数组中的最大值。

const max = arr => Math.max(...arr.filter(v => Boolean(v) || v === 0))

小栗子

max([0, -1, -2, -3, false])
// => 0

10.min数组中最小值

过滤原数组中所有的非假值元素,返回数组中的最小值

const min = arr => Math.min(...arr.filter(v => Boolean(v) || v === 0))

小栗子

min([0, -1, -2, -3, false])
// => -3

11.shuffle打乱数组

创建一个打乱的数组,使用Fisher-Yates算法打乱数组的元素。

const shuffle = ([...arr]) => {let m = arr.lengthwhile (m) {const i = Math.floor(Math.random() * m--);[arr[m], arr[i]] = [arr[i], arr[m]]}return arr
}

小栗子

shuffle([2, 3, 1])
// => [3, 1, 2]

12.sortAsc数组升序

返回升序后的新数组

sort()方法会改变原数组,默认按 unicode 码顺序排列

// 通过ES6 ...展开运算符浅拷贝一份新数组
const sortAsc = arr => [...arr].sort((a, b) => a - b)

小栗子

sortAsc([3, 2, 3, 4, 1])
// => [ 1, 2, 3, 3, 4 ]

13.sortDesc数组降序

返回降序后的新数组。

const sortDesc = arr => [...arr].sort((a, b) => b - a)

小栗子

sortDesc([3, 2, 3, 4, 1])
// => [ 1, 2, 3, 3, 4 ]

14.take截取数组开始指定的元素

从 array 数组的最开始一个元素开始提取 n 个元素。

const take = (arr, n = 1) => arr.slice(0, n)

小栗子

take([2, 3, 1], 2)
// => [2, 3]

15.takeLast截取数组末尾元素

从 array 数组的最后一个元素开始提取 n 个元素

const takeLast = (arr, n = 1) => arr.slice(0, -n)

小栗子

take([2, 3, 1], 2)
// => [3, 1]

16.treeData生成树结构数据

该函数传入一个数组, 每项id对应其父级数据parent_id,返回一个树结构数组

const treeData = (arr, id = null, link = 'parent_id') => arr.filter(item => item[link] === id).map(item => ({ ...item, children: treeData(arr, item.id) }))

参数

  • array 要生成树结构的数组

  • id 自定义属性名

  • parent_id 父级自定义属性名

小栗子

const comments = [{ id: 1, parent_id: null },{ id: 2, parent_id: 1 },{ id: 3, parent_id: 1 },{ id: 4, parent_id: 2 },{ id: 5, parent_id: 4 },
]treeData(comments)// => [ { id: 1, parent_id: null, children: [ [Object], [Object] ] } ]

17.unique数组去重

创建一个去重后的 array 数组副本。

const unique = (...arr) => [...new Set(arr)]// const unique = (...arr) => Array.from(new Set(arr))

小栗子

unique([1, 2, 2, 3, 4, 4, 5])
// => [ 1, 2, 3, 4, 5 ]

18.uniqueBy数组对象去重

创建一个去重后的 array 数组对象副本。

const uniqueBy = (arr, key) => {return arr.reduce((acc, cur) => {const ids = acc.map(item => item[key])return ids.includes(cur[key]) ? acc : [...acc, cur]}, [])
}

参数

  • array 要去重的数组

  • key 要去重的对象属性值

小栗子

const responseList = [{ id: 1, a: 1 },{ id: 2, a: 2 },{ id: 3, a: 3 },{ id: 1, a: 4 },{ id: 2, a: 2 },{ id: 3, a: 3 },{ id: 1, a: 4 },{ id: 2, a: 2 },{ id: 3, a: 3 },{ id: 1, a: 4 },{ id: 2, a: 2 },{ id: 3, a: 3 },{ id: 1, a: 4 },
]uniqueBy(responseList, 'id')// => [ { id: 1, a: 1 }, { id: 2, a: 2 }, { id: 3, a: 3 } ]

最近组建了一个湖南人的前端交流群,如果你是湖南人可以加我微信 ruochuan12 私信 湖南 拉你进群。

推荐阅读

1个月,200+人,一起读了4周源码
我历时3年才写了10余篇源码文章,但收获了100w+阅读

老姚浅谈:怎么学JavaScript?

我在阿里招前端,该怎么帮你(可进面试群)

7f912bfb428a3fdc950710d7693977e9.gif

················· 若川简介 ·················

你好,我是若川,毕业于江西高校。现在是一名前端开发“工程师”。写有《学习源码整体架构系列》10余篇,在知乎、掘金收获超百万阅读。
从2014年起,每年都会写一篇年度总结,已经写了7篇,点击查看年度总结。
同时,最近组织了源码共读活动,帮助1000+前端人学会看源码。公众号愿景:帮助5年内前端人走向前列。

7ba62de75a883f17740106f0cecfbfc6.png

识别方二维码加我微信、拉你进源码共读

今日话题

略。分享、收藏、点赞、在看我的文章就是对我最大的支持~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

美学评价_卡美学的真正美

美学评价In collectible card games like Hearthstone, Legends of Runeterra, and Magic: The Gathering, the aesthetic of the cards is indubitably one of the greatest highlights for many, if not all players. Although the game loop is reliant on physically build…

好程序员web前端分享CSS Bug、CSS Hack和Filter学习笔记

为什么80%的码农都做不了架构师?>>> CSS Bug、CSS Hack和Filter学习笔记 1)CSS Bug:CSS样式在各浏览器中解析不一致的情况,或者说CSS样式在浏览器中不能正确显示的问题称为CSS bug. 2)CSS Hack: CSS中,Hack是指一种兼容CSS在不同…

ux和ui_设计更好的结帐体验-UX / UI案例研究

ux和uiPlated Cuisine is a food ordering and delivery app for Plated Cuisine Restaurant founded and managed by Rayo Odusanya.Plated Cuisine是由Rayo Odusanya创建和管理的Plated Cuisine Restaurant的食品订购和交付应用程序。 A short background about Rayo Rayo O…

Django中ajax发送post请求,报403错误CSRF验证失败解决办法

今天学习Django框架,用ajax向后台发送post请求,直接报了403错误,说CSRF验证失败;先前用模板的话都是在里面加一个 {% csrf_token %} 就直接搞定了CSRF的问题了;很显然,用ajax发送post请求这样就白搭了&…

如何在EXCEL中添加下拉框

筛选主要是将已有列的信息以下拉框的形式显示出来 选中数据栏中的筛选按钮即可生成 如果是想添加未有信息则如下图步骤 首先,选择你要出现下拉的区域,在数据栏中的选择数据有效性 然后,下面对话框中,有效性条件中按如下设置即可&a…

每次新增页面复制粘贴?100多行源码的 element-ui 的新增组件功能教你解愁

1. 前言大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信ruochuan12 参与,每周大家一起学习200行左右的源码,共同进步。已进行三个月了,很多小伙伴表示收获颇丰。想学源码,极力推荐之前我…

原子设计_您需要了解的有关原子设计的4件事

原子设计重点 (Top highlight)Industries such as Architecture or Industrial Design have developed smart modular systems for manufacturing extremely complex objects like airplanes, ships, and skyscrapers. Inspired by this, Atomic Design was proposed as a syst…

C#中的Clipboard与ContextMenuStrip应用举例

今天,突然想起了怎样在一个文本中实现复制、剪切与粘贴的功能,并给这些功能添加右键的快捷方式。于是,就用自己的VS2008写了一个简单的小应用,以熟悉C#中剪贴板与快捷菜单的使用。 首先,我们不难发现,剪贴板…

控制台ui_设计下一代控制台UI

控制台ui游戏UX (GAMES UX) Yesterday’s Sony presentation showed us the final look of the PlayStation 5, as well as an impressive of next-gen games that will be released with it. What we didn’t get to see, however, is the new operating system and it’s use…

写给前端新手看的一些模块化知识

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信ruochuan12 进群参与,每周大家一起学习200行左右的源码,共同进步。已进行三个月了,很多小伙伴表示收获颇丰。一、 为什么需要模块化以前没有模块化时…

代码实现照片素描_我的代码素描之旅

代码实现照片素描In 2018 I started the process of consistently creating and posting my code sketches online. These are small animations I make with code and post on instagram. Through these sketches I tried to visually express my ideas using color, animatio…

真效率神器,UI稿智能转换成前端代码,准确率极高

大家好,我是若川。在这充满网络促销活动的几个月,倍感压力的,除了你的口袋,是否还有程序员的发量呢?每年的双十一、双十二购物狂欢节,各大电商平台都会上线让消费者充满购买欲望的活动页面,而这…

几个用于序列化的代码片段

参考JavaScriptSerializer,一般用来做JSON格式化http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptconverter.aspxDataContractSeria…

桌面图标摆放图案_用图标制作醒目的图案

桌面图标摆放图案Level up your video calls with a custom backdrop created using Noun Project icons.使用使用Noun Project图标创建的自定义背景来升级视频通话。 The only thing more visually pleasing than a well-designed icon is a neat, eye-catching pattern made…

3个多月,近3000人参与的源码共读,诚邀加入~

大家好,我是若川。众所周知,从8月份开始,我组织了源码共读活动,每周学习200行左右的源码,到现在持续了3个多月,坚持答疑解惑。帮助了不少人,还是挺开心的。另外,涌现了很多优秀的读者…

“这张图告诉你什么?”

For data to be impactful, it must be understood.为了使数据具有影响力,必须理解它。 I’ve happily spent hundreds and hundreds of hours of my life watching users misunderstand data visualizations. I’m strangely hooked on it.我快乐地度过了数百个小…

我们从 UmiJS 迁移到了 Vite

大家好,我是若川。最近组织了源码共读活动,感兴趣的可以点此加我微信ruochuan12 进群参与,每周大家一起学习200行左右的源码,共同进步。已进行三个月了,很多小伙伴表示收获颇丰。我们从 UmiJS迁移到 Vite 已经上线半年…

将DataTable的内容以EXCEl的形式导出到本地

1.在搞项目的时候一般会遇到,将GridView或者Repeater的内容以Excel的形式保存到本地,即导出功能。我总结了两个方法。 方法一: 1 DataTable dt query.GetItems().GetDataTable();2 if (dt ! null)3 {4 …

智能家居数据库设计_设计更智能的数据表

智能家居数据库设计重点 (Top highlight)Data tables are hard. There are many different ways to think about them. So, naturally, the first step would be to figure out what your users need.数据表很难。 有许多不同的方式来考虑它们。 因此,自然地&#x…

可能是全网首个前端源码共读活动,诚邀你加入一起学习

大家好,我是若川。众所周知,从8月份开始,我组织了源码共读活动,每周学习200行左右的源码,到现在持续了3个多月,坚持答疑解惑。帮助了不少人,还是挺开心的。另外,涌现了很多优秀的读者…