我想到了至少几个内置函数。
地图()
这个很明显。
[1, 2, 3]
.map(someNumber => someNumber * someNumber)
.map((powered, index) => index + "::" + powered);
// --> [ "1::1", "2::4", "3::9" ]
链很好,对吧?接受一些输入并生成由元素组成的结果,这些元素通过逐元素应用函数计算得出。
建议:尽可能尝试使用纯函数(对相同的输入产生相同的结果,尽可能不要改变原始集合,也不要产生任何副作用)。
forEach()
这个函数也遍历数组的所有元素,并应用一个函数,没有返回任何东西。因此,它只能结束一个调用链,而不能用于进一步的链接。
[1, 2, 3, 4]
.forEach(number => console.info(number));
建议:forEach() 非常有用,当我们想要编写一些代码会导致被迭代的集合中的每个条目产生副作用时。
过滤器()
过滤器函数使用一个谓词,用于从谷壳中筛选小麦。谓词为您要在下一个“阶段”处理的项目定义标准。
[null, undefined, 0, 1, 2, 3, NaN, "", "You get the idea"]
.filter(Boolean)
.map(filteredElement => filteredElement + "!")
// --> [ "1!", "2!", "3!", "You get the idea!" ]
建议:尽可能使用纯函数。 IE。除了与过滤逻辑本身直接相关的事情之外,不要在 filter 中做任何其他事情。
Object.keys() 和 Object.entries()
当我们需要迭代对象的键或键值对而不是数组的元素时,这两个函数很有帮助。
const targetObject = { a: 1, b: 2, c: 3 };
Object
.keys(targetObject)
.map(key => key + "=" + targetObject[key])
// --> [ "a=1", "b=2", "c=3" ]
这样也可以达到同样的效果
Object
.entries({ a: 1, b: 2, c: 3 })
.map((key, value) => key + "=" + value)
// --> [ "a=1", "b=2", "c=3" ]
建议:在使用Object.keys(...) 时,您可能需要使用Object.hasOwnProperty(...)。详情请见documentation。
查找()
这几乎是微不足道的。让我们搜索与谓词匹配的项目。搜索是“从左到右”的,只要找到第一个“匹配”就停止。
[1, 5, 10, 15]
.find(number >= 7)
// --> 10
findIndex() 函数可以在我们寻找与谓词匹配的元素位置时使用。
some() 和every()
这些函数检查是否
a) 至少有一个元素与谓词匹配;要么
b) 每个元素都匹配一个谓词。
const arrayOfNumbers = [2, 4, 6, 8, 10];
arrayOfNumbers.every(number => number % 2 === 0); // --> true
arrayOfNumbers.every(number => number % 2 === 1); // --> false
arrayOfNumbers.some(number => number > 1); // --> true
arrayOfNumbers.some(number => number <= 1); // --> false
reduce() 和`reduceRight()`
本快速回顾中要提到的最后一个功能是获取事物列表并将其聚合为单个结果的函数。
[-1, 0, 1, 2, 3]
.filter(value => value >= 0) // [0, 1, 2, 3]
.map(value => value + 1) // [1, 2, 3, 4]
.reduce((subTotal, currentValue) => subTotal + currentValue, 5);
// --> 15
建议:尽可能使用纯函数。
普遍适用的性能说明。在我的基准测试中(手头没有它们),手写的for 循环总是比forEach、map 和其他迭代函数快。除非性能受到严重影响,否则我仍然更喜欢这些功能。这有两个主要原因:1)更容易避免一次错误; 2) 代码更具可读性,因为每个单独的函数在数据处理流程中定义了一个独立的步骤,从而使代码更简单,更易于维护。
我希望,这是对一些内置链式 JavaScript 函数的概述。更多的是described here。看看concat()、sort()、fill()、join()、slice()、reverse()——我也经常使用它们。
如果您需要first() 或last() 之类的东西,您将无法在本机函数中找到它们。要么自己写,要么使用第三方库(例如lodash、rambda.js)。