> ['a', 'b'].map(Array.of)
[ [ 'a', 0, [ 'a', 'b' ] ],
[ 'b', 1, [ 'a', 'b' ] ] ]
> ['a', 'b'].map(x => Array.of(x)) // better
[ [ 'a' ], [ 'b' ] ]
> ['a', 'b'].map(x => [x]) // best (in this case)
[ [ 'a' ], [ 'b' ] ]
如你所看,map()会传递三个参数到它的回调里面。最后两个又是经常被忽略的(详细)。
原型方法(Prototype methods)
数组的实例会有很多新的方法可用。
数组里的迭代(Iterating over arrays)
以下的方法,会帮助完成在数组里的迭代:
复制代码 代码如下:
Array.prototype.entries()
Array.prototype.keys()
Array.prototype.values()
以上的每一个方法都会返回一串值,却不会作为一个数组返回。它们会通过迭代器,一个接一个的显示。让我们看一个示例(我将使用Array.from()将迭代器的内容放在数组中):
复制代码 代码如下:
> Array.from([ 'a', 'b' ].keys())
[ 0, 1 ]
> Array.from([ 'a', 'b' ].values())
[ 'a', 'b' ]
> Array.from([ 'a', 'b' ].entries())
[ [ 0, 'a' ],
[ 1, 'b' ] ]
你可以结合entries()和ECMAScript 6中的for-of循环,方便地将迭代对象拆解成key-value对:
复制代码 代码如下:
for (let [index, elem] of ['a', 'b'].entries()) {
console.log(index, elem);
}
Note: 这段代码已经可以在最新的Firefox浏览器里运行了。t Firefox.
查找数组元素
Array.prototype.find(predicate, thisArg?) 会返回满足回调函数的第一个元素。如果没有任何一个元素满足条件,它会返回undefined。比如:
复制代码 代码如下:
> [6, -5, 8].find(x => x < 0)
-5
> [6, 5, 8].find(x => x < 0)
undefined
Array.prototype.findIndex(predicate, thisArg?)
会返回满足回调函数的第一个元素的索引。如果找不任何满足的元素,则返回-1。比如:
复制代码 代码如下:
> [6, -5, 8].findIndex(x => x < 0)
1
> [6, 5, 8].findIndex(x => x < 0)
-1
两个find*方法都会忽略洞(holes),即不会关注undefined的元素。回调的完成函数签名是:
predicate(element, index, array)
通过findIndex()找NaN
Array.prototype.indexOf()有一个大家所熟知的限制,那就是不能查找NaN。因为它用恒等(===)查找匹配元素:
复制代码 代码如下:
> [NaN].indexOf(NaN)
-1
使用findIndex(),你就可以使用Object.is(),这就不会产生这样的问题:
复制代码 代码如下:
> [NaN].findIndex(y => Object.is(NaN, y))
0
你同样也可以采用更通用的方式,创建一个帮助函数elemIs():
复制代码 代码如下:
> function elemIs(x) { return Object.is.bind(Object, x) }
> [NaN].findIndex(elemIs(NaN))
0
Array.prototype.fill(value, start?, end?)
用所给的数值,填充一个数组:
复制代码 代码如下:
> ['a', 'b', 'c'].fill(7)
[ 7, 7, 7 ]
洞(Holes)也不会有任何的特殊对待:
复制代码 代码如下:
> new Array(3).fill(7)
[ 7, 7, 7 ]
你也可以限制你填充的起始与结束:
复制代码 代码如下:
> ['a', 'b', 'c'].fill(7, 1, 2)
[ 'a', 7, 'c' ]
什么时候可以使用新的数组方法?
有一些方法已经可以在浏览器里使用了。
您可能感兴趣的文章: