基本上就是标题所说的:我希望能够在反向数组上调用
.map
,但我担心它会太慢,因为我必须多次执行此操作。
我知道以下方法有效:
let arr = [1, 2, 3, 4, 5];
let rev_wrapped = arr.slice(0).reverse().map(item => `wrapped: ${item}`);
其中
rev_wrapped
结果是:
[
'wrapped: 5',
'wrapped: 4',
'wrapped: 3',
'wrapped: 2',
'wrapped: 1'
]
我想知道是否有更快的方法来做到这一点,因为
.reverse()
完全反转了数组,而我只需要以相反的顺序读取数据。
如果这是不可能的,我也可以使用允许我在开始时插入元素而无需太多计算成本的数据结构(因为像
arr.splice(0,0,new_item)
这样的东西会在每次插入时完全重新排列数组)。
您当前的代码对数组进行了三遍(
slice
,用于制作副本;reverse
,用于反转数组;map
用于映射它)。 如果性能是一个问题,并且您发现当前的方法太慢,那么您最好只使用一个简单的循环:
let arr = [1, 2, 3, 4, 5];
let rev_wrapped = new Array(arr.length);
for (let i = 0, n = arr.length - 1; n >= 0; --n, ++i) {
rev_wrapped[i] = `wrapped: ${arr[n]}`;
}
console.log(rev_wrapped);
通常,
new Array
是一种反模式,但在现代 JavaScript 引擎中,new Array(5)
通常会预先分配存储(这是我最近了解到的并且令我惊讶的事情)。
Array.from
: 中使用地图回调
let arr = [1, 2, 3, 4, 5];
let rev_wrapped = Array.from(arr, (_, index) => {
const item = arr[arr.length - index - 1];
return `wrapped: ${item}`;
});
console.log(rev_wrapped);
您可以使用这个简单的辅助函数(或者在您想要使用它的任何地方内联其实现,如果需要用于链接目的)。
function reversedMap(arr, mapper) {
const { length } = arr;
return arr.map((_, i) => mapper(arr[length - 1 - i]));
}
let arr = [1, 2, 3, 4, 5];
console.log(reversedMap(arr, item => `wrapped: ${item}`));