如何遍历结构未知的对象中的所有数字并转换为绝对值?
任意结构对象的全量数字绝对值转换方案
实现思路很直接,用递归遍历所有节点,根据节点类型做对应处理即可,同时要覆盖数组、嵌套对象等常见结构,还要规避循环引用导致的栈溢出问题。
实现代码
function convertAllNumbersToAbs(input, processed = new Set()) { // 处理数字类型,直接返回绝对值 if (typeof input === 'number') { return Math.abs(input); } // 处理无需修改的非对象类型:null、undefined、字符串、布尔值、函数等 if (typeof input !== 'object' || input === null) { return input; } // 处理循环引用,避免递归爆栈 if (processed.has(input)) { return input; } processed.add(input); // 处理数组类型,遍历每一项递归处理 if (Array.isArray(input)) { return input.map(item => convertAllNumbersToAbs(item, processed)); } // 处理普通对象,遍历每个属性递归处理 const result = {}; for (const key in input) { if (Object.prototype.hasOwnProperty.call(input, key)) { result[key] = convertAllNumbersToAbs(input[key], processed); } } return result; }
用法示例
// 测试用例 const testObj = { num: -123, nums: [-1, 2, -3, [4, -5]], anyObj: { a: -6, b: '字符串不会被修改', c: false, d: null, e: { nested: -7.89 } } }; // 增加循环引用测试场景 testObj.anyObj.f = testObj; const processedObj = convertAllNumbersToAbs(testObj); console.log(processedObj); /* 输出所有数字均为绝对值: { num: 123, nums: [1, 2, 3, [4, 5]], anyObj: { a: 6, b: '字符串不会被修改', c: false, d: null, e: { nested: 7.89 }, f: [循环引用指向自身] } } */
补充说明
- 支持任意层级的嵌套对象、嵌套数组结构
- 不会修改原对象,返回的是处理后的新对象,如果需要直接修改原对象,可调整代码中遍历赋值的逻辑,直接修改原对象的属性值即可。
内容的提问来源于stack exchange,提问作者Shan Surat
相关产品推荐
相关产品推荐

