首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Javascript -使用forEach向后循环通过数组

Javascript -使用forEach向后循环通过数组
EN

Stack Overflow用户
提问于 2015-09-21 02:44:34
回答 5查看 63.5K关注 0票数 54

有没有一种方法可以使用forEach (不是任何其他类型的循环,我知道如何使用for /标准方法)在不实际反转数组本身的情况下对数组进行反向循环?

EN

回答 5

Stack Overflow用户

发布于 2015-09-21 02:59:12

代码语言:javascript
复制
let arr = [1, 2, 3];

arr.slice().reverse().forEach(x => console.log(x))

将打印:

代码语言:javascript
复制
3
2
1

arr仍为[1, 2, 3].slice()会创建一个浅拷贝。

票数 78
EN

Stack Overflow用户

发布于 2019-01-19 04:16:28

只需使用for循环即可。从数组的末尾开始,从那里向后返回。

代码语言:javascript
复制
const array = ['blastoff', 1, 2, 3];

for (let index = array.length - 1; index >= 0; index--) {
  const element = array[index];
  console.log(element);
}

票数 16
EN

Stack Overflow用户

发布于 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.revEachArray.forEach快17倍。

代码语言:javascript
复制
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);
            }
        }
    });
}

只需添加修改为反向的实际官方填充即可。注释显示了我的更改。

代码语言:javascript
复制
// 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
    }
  };
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32682962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档