代码之家  ›  专栏  ›  技术社区  ›  Sandra Schlichting

删除嵌套对象的键?

  •  1
  • Sandra Schlichting  · 技术社区  · 4 年前

    this question 我得到了一些很好的答案,但事实证明我把我所面临的问题过于简化了。

    我有同样的目标

    const obj = {
      a: 'A',
      b: {
        bb: 'BB',
        bbb: 'BBB',
        },
      c: 'C'
    };
    

    我需要以某种方式结束

    { a: 'A', bb: 'BB', bbb: 'BBB', c: 'C' }
    

    问题

    有人能想出如何从嵌套对象中删除键,但仍然保留嵌套对象吗?

    2 回复  |  直到 4 年前
        1
  •  2
  •   Aplet123    4 年前

    可以递归地将其展平:

    function flattenObject(obj) {
        const ret = {};
        for (const [key, val] of Object.entries(obj)) {
            if (typeof val === "object") {
                Object.assign(ret, flattenObject(val));
            } else {
                ret[key] = val;
            }
        }
        return ret;
    }
    
        2
  •  2
  •   Ori Drori    4 年前

    Object.entries() . 迭代成对的 Array.flatMap() . 如果值是object,则使用该值调用函数。如果不返回 { [key]: value } . 通过将对象数组扩展到 Object.assign() .

    对象.assign()

    const fn = obj => Object.assign({},
      ...Object.entries(obj)
        .flatMap(([k, v]) => typeof(v) === "object" ? fn(v) : { [k]: v })
    );
    
    const j = { a: 'A', b: { bb: 'BB', bbb: 'BBB' }, c: 'C' };
    
    const result = fn(j);
    
    console.log(result);

    另一种选择是直接与 [key, value] p ),然后使用 Object.fromEntries()

    const fn = obj =>
      Object.entries(obj)
        .flatMap(p => typeof(p[1]) === "object" ? fn(p[1]) : [p])
    
    const j = { a: 'A', b: { bb: 'BB', bbb: 'BBB' }, c: 'C' };
    
    const result = Object.fromEntries(fn(j));
    
    console.log(result);