TypeScript中forEach与for in循环递归处理对象结果差异问题问询
差异原因
两个函数中return关键字的作用域完全不同,是导致行为不一致的核心原因:
- 使用
forEach实现的函数中,return作用于forEach接收的回调函数:仅会终止当前这一轮回调的执行,不会跳出整个forEach遍历循环。递归处理完当前对象类型的属性后,程序会回到循环中继续处理剩余的其他属性,因此可以完整遍历所有属性完成去空格。 - 使用
for in实现的函数中,return直接作用于trimWithForIn函数本身:只要遍历到第一个类型为对象的属性,执行return trimWithForIn(obj[prop])后,整个trimWithForIn函数就会直接终止执行,剩余未遍历的属性会被完全跳过,因此只会处理第一个对象属性和递归内部的属性,外层其他属性都不会被处理。
修复方案
只要去掉for in循环内递归调用前的return关键字即可,修改后代码如下:
function trimWithForIn(obj: any): any { if (obj !== null && typeof obj === 'object') { for (var prop in obj) { // 若属性为对象则递归处理,去掉return即可避免函数提前终止 if (typeof obj[prop] === 'object') { trimWithForIn(obj[prop]); } // 若属性为字符串则去除首尾空白字符 if (typeof obj[prop] === 'string') { obj[prop] = obj[prop].trim(); } } } }
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

