如何实现支持对象类型遍历的lodash风格forEachRight函数?
手动实现lodash的forEachRight函数问题分析与实现方案
核心问题梳理
你当前的实现存在两个核心逻辑错误,和特殊返回值判断无关:
- 对象遍历顺序逻辑错误:你在
for in正序遍历对象key的同时直接执行了回调,只是把回调返回值用unshift倒序存入数组,回调本身的执行顺序还是正序的,这就是为什么调用console.log时输出是23、24、25而非预期倒序的原因。 - 认知误区:
console.log()执行后的原生返回值就是undefined,你收集到的全是undefined的数组属于正常现象,不存在需要特殊适配return console.log这类场景的需求,lodash也不会做这类冗余判断。
正确实现思路
lodash处理对象类型的forEachRight逻辑非常简单,没有复杂判断:
- 先把对象所有自身可枚举的key收集为一个正序数组
- 倒序遍历这个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
相关产品推荐
相关产品推荐

