You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现支持对象类型遍历的lodash风格forEachRight函数?

手动实现lodash的forEachRight函数问题分析与实现方案

核心问题梳理

你当前的实现存在两个核心逻辑错误,和特殊返回值判断无关:

  • 对象遍历顺序逻辑错误:你在for in正序遍历对象key的同时直接执行了回调,只是把回调返回值用unshift倒序存入数组,回调本身的执行顺序还是正序的,这就是为什么调用console.log时输出是23、24、25而非预期倒序的原因。
  • 认知误区:console.log()执行后的原生返回值就是undefined,你收集到的全是undefined的数组属于正常现象,不存在需要特殊适配return console.log这类场景的需求,lodash也不会做这类冗余判断。

正确实现思路

lodash处理对象类型的forEachRight逻辑非常简单,没有复杂判断:

  1. 先把对象所有自身可枚举的key收集为一个正序数组
  2. 倒序遍历这个key数组,逐个执行回调即可

完整实现代码

_.forEachRight = function(collection, callback) {
  // 处理数组类集合
  if (Array.isArray(collection)) {
    for (let i = collection.length - 1; i > -1; i--) {
      // 对齐lodash原生逻辑:回调返回false时中断遍历
      if (callback(collection[i], i, collection) === false) {
        break;
      }
    }
  } 
  // 处理对象类集合
  else if (typeof collection === 'object' && collection !== null) {
    // 先收集所有自身可枚举属性的key
    const keys = Object.keys(collection);
    // 倒序遍历key数组
    for (let i = keys.length - 1; i > -1; i--) {
      const key = keys[i];
      if (callback(collection[key], key, collection) === false) {
        break;
      }
    }
  }
  // 对齐lodash原生返回规则:返回原集合
  return collection;
};

效果验证

用你提供的测试对象测试:

const brothers = {
  Toby: 23,
  Max: 24,
  John: 25
};

_.forEachRight(brothers, function(value, name) {
  console.log(value, name);
});

输出符合预期倒序:

25 John
24 Max
23 Toby

内容的提问来源于stack exchange,提问作者Sun23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:45:04