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

如何遍历结构未知的对象中的所有数字并转换为绝对值?

任意结构对象的全量数字绝对值转换方案

实现思路很直接,用递归遍历所有节点,根据节点类型做对应处理即可,同时要覆盖数组、嵌套对象等常见结构,还要规避循环引用导致的栈溢出问题。

实现代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 23:39:04