有没有一种方法可以使用forEach
(不是任何其他类型的循环,我知道如何使用for /标准方法)在不实际反转数组本身的情况下对数组进行反向循环?
发布于 2015-09-21 02:59:12
let arr = [1, 2, 3];
arr.slice().reverse().forEach(x => console.log(x))
将打印:
3
2
1
arr
仍为[1, 2, 3]
,.slice()
会创建一个浅拷贝。
发布于 2019-01-19 04:16:28
只需使用for循环即可。从数组的末尾开始,从那里向后返回。
const array = ['blastoff', 1, 2, 3];
for (let index = array.length - 1; index >= 0; index--) {
const element = array[index];
console.log(element);
}
发布于 2015-09-21 03:28:10
到目前为止,浏览器似乎还没有优化Array.forEach
函数。只需很少的工作,您就可以编写一个简单的polyfill,它的性能至少是Array.forEach
方法的10 : 1。
因此,您可以创建自己的Array.revEach
并使其性能优于原生Array.forEach
,但我希望浏览器能尽快解决Array.forEach
非常慢的性能问题,并使实际存在的方法不再需要填充。
在“Chrome46.0.2490.22beta-m”上,Array.revEach
比Array.forEach
快17倍。
if (Array.prototype.revEach === undefined) {
Object.defineProperty(Array.prototype, 'revEach', {
writable : false,
enumerable : false,
configurable : false,
value : function (func) {
var i;
var len = this.length-1;
for (i = len; i >= 0; i--) {
func(this[i], i, this);
}
}
});
}
只需添加修改为反向的实际官方填充即可。注释显示了我的更改。
// Production steps of ECMA-262, Edition 5, 15.4.4.18
// Reference: http://es5.github.io/#x15.4.4.18
// Modified by Blindman67 to revEach
if (!Array.prototype.revEach) { // name changed
Array.prototype.revEach = function(callback, thisArg) { // name changed
var T; // k defined where len was
if (this == null) {
throw new TypeError(' this is null or not defined');
}
var O = Object(this);
var k = (O.length >>> 0)-1; // set k (counter) ToUint32
// len var removed
if (typeof callback !== "function") {
throw new TypeError(callback + ' is not a function');
}
if (arguments.length > 1) {
T = thisArg;
}
while (k >= 0) { // reverse condition
var kValue;
if (k in O) {
kValue = O[k];
callback.call(T, kValue, k, O);
}
k--; // dec counter
}
};
}
https://stackoverflow.com/questions/32682962
复制相似问题