关于JavaScript 数组你应该知道的事情(推荐)(4)

const potentialParticipants = [ { id: 'k38i', name: 'john', age: 17 }, { id: 'baf3', name: 'mary', age: 13 }, { id: 'a111', name: 'gary', age: 24 }, { id: 'fx34', name: 'emma', age: 34 }, ] const participantsFormatted = potentialParticipants .filter(user => user.age > 18) .map(user => user.name) .join(', ') console.log(participantsFormatted) // gary, emma

from

这是一个静态方法,从类数组中创建新的数组,或者像例子中的字符串一样遍历对象。当处理 dom 时,这个方法十分有用。

const nodes = document.querySelectorAll('.todo-item') // 这是一个 nodeList 实例 const todoItems = Array.from(nodes) // 现在你能使用 map filter 等等,就像在数组中那样!

你曾经见到过我们使用 Array 代替数组实例吗?这就是问什么 from 被称作静态方法。

接着可以愉快处理这些节点,比如用 forEach 在每个节点上注册事件监听:

todoItems.forEach(item => { item.addEventListener('click', function() { alert(`You clicked on ${item.innerHTML}`) }) })

最好了解突变

下面是其他常见的数组方法。不同之处在于,它们会修改原数组。修改数组并没有什么错,最好是你应该有意识去修改它。

对于这些方法,如果你不想去改变原数组,只能在操作前浅拷贝或者深拷贝。

const arr = [1, 2, 3, 4, 5] const copy = [...arr] // or arr.slice()

sort

是的,sort 修改了原数组。事实上,在这里进行了数组元素排序。默认的排序方法把所有的元素转换成字符串,然后按照字母表排序它们。

const names = ['john', 'mary', 'gary', 'anna'] names.sort() console.log(names) // ['anna', 'gary', 'john', 'mary']

如果你有 Python 背景的话,要小心了。使用 sort 在数字数组中不会得到你想要的结果

const numbers = [23, 12, 17, 187, 3, 90] numbers.sort() console.log(numbers) // [12, 17, 187, 23, 3, 90] 🤔。

那么如何对一个数组排序?额,sort 接受一个函数,一个比较函数。这个函数接受两个参数:第一个元素(我们称呼为 a)和第二个元素作比较(b)。这两个元素之间的比较需要返回一个数字。

如果为负,a 排序在 b 之前。

如果为正,b 排序在 a 之前。

如果是0,没有任何改变。

那么你可以使用下面的方式排序数组:

const numbers = [23, 12, 17, 187, 3, 90] numbers.sort((a, b) => a - b) console.log(numbers) // [3, 12, 17, 23, 90, 187]

或者通过最近时间排序:

const posts = [ { title: 'Create a Discord bot under 15 minutes', date: new Date(2018, 11, 26), }, { title: 'How to get better at writing CSS', date: new Date(2018, 06, 17) }, { title: 'JavaScript arrays', date: new Date() }, ] posts.sort((a, b) => a.date - b.date) // Substracting two dates returns the difference in millisecond between them console.log(posts) // [ { title: 'How to get better at writing CSS', // date: 2018-07-17T00:00:00.000Z }, // { title: 'Create a Discord bot under 15 minutes', // date: 2018-12-26T00:00:00.000Z }, // { title: 'Learn Javascript arrays the functional way', // date: 2019-03-16T10:31:00.208Z } ]

fill

fill 修改或者填充了数组的所有元素,从开始索引到结束索引,使用一个静态值。fill 最有用的作用是使用静态值填充一个新数组。

// Normally I would have called a function that generates ids and random names but let's not bother with that here. function fakeUser() { return { id: 'fe38', name: 'thomas', } } const posts = Array(3).fill(fakeUser()) console.log(posts) // [{ id: "fe38", name: "thomas" }, { id: "fe38", name: "thomas" }, { id: "fe38", name: "thomas" }]

reverse

这个方法名在这里显而易见。然而,像留意 sort 那样,reverse 会反转数组的位置。

const numbers = [1, 2, 3, 4, 5] numbers.reverse() console.log(numbers) // [5, 4, 3, 2, 1]

你可以替换的方法

终于,在这个最后的部分,你将发现改变原数组的方法,同时可以很容易替换其中一些。我不是说你应该抛弃这些方法。只是想要你意识到一些数组方法有副作用,并且这里有可选择的其他方法。

push

处理数组时这是使用最多的方法。事实上,push 允许你在数组中添加一个或者多个元素。它也通常基于一个旧数组构建一个新数组。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/867d56da37c5c53f4cce5a73f0a9dca0.html