javascript - 递归地跟踪带有最终值的嵌套对象键

标签 javascript recursion

给定一个如下所示的对象(可以具有未知数量的嵌套属性)

const theme = {
    fonts: {
        primary: 'Arial',
        secondary: 'Helvetica'
    },
    colors: {
        primary: 'green',
        secondary: 'red',
    },
    margin: {
        small: '0.5rem',
        medium: '1rem',
        large: '1.5rem'
    }
}

我正在努力实现以下目标:

  1. 递归循环,直到遇到一个不是对象的值
  2. 当我达到这个值时,我希望能够访问导致该值的所有键以及最终值。

类似于以下内容:

['字体', '主要'], 'Arial'

['字体', '次要'] 'Helvetica'

['颜色', '主色'] '绿色'

等等

我尝试过各种不同的尝试,但困扰我的是如何跟踪按键,并在再次调用原始循环时重置它们? 🤔

最佳答案

您可以采用递归方法检查对象并将嵌套子结果映射到最终结果。

const
    getPathes = object => Object
        .entries(object)
        .reduce((r, [k, v]) => {
            if (v && typeof v === 'object') {
                r.push(...getPathes(v).map(([p, v]) => [[k, ...p], v]));
            } else {
                r.push([[k], v]);
            }
            return r;
        }, []),
    theme = { fonts: { primary: 'Arial', secondary: 'Helvetica' }, colors: { primary: 'green', secondary: 'red' }, margin: { small: '0.5rem', medium: '1rem', large: '1.5rem' } };
    
console.log(getPathes(theme));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 递归地跟踪带有最终值的嵌套对象键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63071375/

相关文章:

haskell - 是否可以使用有理数创建递归数据类型,例如 -> data Nat = Zero |苏克纳特?

javascript - 递归函数和这个 D3.JS

javascript - 建议我不要使用 <table>!

python - 装饰器可以装饰递归函数吗?

c++ - 有没有办法在它以编程方式返回的引用上多次调用一个函数? -元组动态访问

javascript - 使用 jquery 选择单个下一个兄弟

C - 递归函数

javascript - Titanium ACS SDK - 404 无法验证用户身份

c# - ASP.NET MVC 4 脚本 bundle 在部署时导致错误

javascript - 添加新字段时为 FieldArray 中的 redux-form Field 赋予默认值