【问题标题】:Transform or normalize nested JSON using lodash使用 lodash 转换或规范化嵌套的 JSON
【发布时间】:2018-09-01 23:42:32
【问题描述】:

我正在尝试转换一个嵌套结构,使用lodash的库,我已经达到了预期的结果,但是如果结构发生变化它们就不起作用了,所以我来找你帮助我使转换的功能更加健壮JSON。

初始结构如下所示

const data = {
  foo: {
    bar: {
      baz: [{ a: 1, b: 2, c: 3 }]
    },
    baz: {
      bar: [{ a: 1, b: 2, c: 3 }]
    },
    foo: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  bar: {
    baz: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  baz: {
    foo: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  }
};

变身后

const transform = [
  {
    name: 'barfoo',
    results: [{ a: 1, b: 2, c: 3 }]
  },
  {
    name: 'bazfoo',
    results: [{ a: 1, b: 2, c: 3 }]
  },
  {
    name: 'foofoo',
    results: [{ a: 1, b: 2, c: 3 }]
  },
  {
    name: 'bazbar',
    results: [{ a: 1, b: 2, c: 3 }]
  },
  {
    name: 'foobaz',
    results: [{ a: 1, b: 2, c: 3 }]
  }
];

变换的思路是将第一层的嵌套key和父节点的key连接起来,生成新对象中name的值,第二层对象的值作为值results

例如对于数据中 foo 对象的第一次迭代

name = key(foo.bar) + key(foo)
results = value(foo.bar.baz)

name = 'barfoo'
results = [{ a: 1, b: 2, c: 3 }]

name = key(foo.baz) + key(foo)
results = value(foo.baz.bar)

name = 'bazfoo'
results = [{ a: 1, b: 2, c: 3 }]

name = key(foo.foo) + key(foo)
results = value(foo.foo.bar)

name = 'foofoo'
results = [{ a: 1, b: 2, c: 3 }]

数据内部的其他对象也是如此。

【问题讨论】:

  • 你为什么要让我们猜测转换后的数据是如何从原始数据中获得的?你让它变得特别困难,因为所有结果对象都是相同的。请帮我们解释一下barfoo和其他人的来源以及转换背后的逻辑。
  • 所以这有点帮助,但它仍然没有说明 barfoo 来自哪个对象。是data.foo.foo.bar 的那个吗? data.baz.foo.bar? data.foo.baz.bar?
  • 感谢您的帮助马克,我已经更新了问题,希望能更好地理解一点

标签: javascript functional-programming lodash


【解决方案1】:

我不确定结构是否会发生变化,但我添加了一些额外的测试用例,以便您了解它在其他一些场景中的表现。

const data = {
  foo: {
    bar: {
      baz: [{ a: 1, b: 2, c: 3 }]
    },
    baz: {
      bar: [{ a: 1, b: 2, c: 3 }]
    },
    foo: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  bar: {
    baz: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  baz: {
    foo: {
      bar: [{ a: 1, b: 2, c: 3 }]
    }
  },
  a1: {
    a2: [{ a: 1, b: 2, c: 3 }]
  },
  b1: [{ a: 1, b: 2, c: 3 }],
  c1: {
    c2: {
      c3: {
        c4: [{ a: 1, b: 2, c: 3 }]
      }
    },
    c5: [{ a: 1, b: 2, c: 3 }]
  },
  d1: {
    d2: {
        d3: undefined
    }
  },
  e1: {
    e2: {
        e3: null
    }
  },
  f1: {
    f2: {
        // Ignored
    }
  }
};

function transformObject(object, name) {
    if (!name) {
        name = "";
    }
    return _.flatten(_.map(object, function(value, key) {
        if (typeof value === "undefined" 
            || value === null 
            || _.isArray(value)) {
            return {
                name: name,
                results: value
            }
        }
        var objectName = key + name;
        return transformObject(value, objectName);
    }));
}

transformObject(data);

【讨论】:

    猜你喜欢
    • 2017-10-27
    • 2021-07-15
    • 2018-04-09
    • 2014-10-23
    • 2021-07-23
    • 2019-12-22
    • 2021-08-02
    • 2020-06-21
    • 2020-11-09
    相关资源
    最近更新 更多