Javascript Json对象到带点划线的键的对象

时间:2018-08-23 19:42:40

标签: javascript json parsing object

我需要解析Json响应

{
   "product": "office",
   "info": 
   {
      "brand": 
      [
        "1brand"
      ],
      "detail": 
      {
        "number": 
        {
            "min": 1,
            "max": 5
         },
       }
   }
};

使用带点缀的字符串键的对象

{
    "product" : "office",
    "info.brand" : ["1brand"],
    "info.detail.number.min" : 1,
    "info.detail.number.max" : 5
}

未知嵌套和相邻对象的数量。解决方案应该是具有一个参数的函数-响应对象,然后返回新对象(带有虚线字符串键)。

2 个答案:

答案 0 :(得分:1)

您可以对每个级别的嵌套对象采用递归方法,并收集键并将其用于新对象中的最后找到的值。

function flatKeys(object) {

    function iter(part, keys) {
        Object.keys(part).forEach(function (k) {
            var allKeys = keys.concat(k);
            if (part[k] && !Array.isArray(part[k]) && typeof part[k] === 'object') {
                return iter(part[k], allKeys);
            }
            flat[allKeys.join('.')] = part[k];
        });
    }

    var flat = {};
    iter(object, []);
    return flat;
}

var object = { product: "office", info: { brand: ["1brand"], detail: { number: { min: 1, max: 5 } } } };

console.log(flatKeys(object));

答案 1 :(得分:0)

您可以使用reduce方法创建递归函数。

let data = {"product":"office","info":{"brand":["1brand"],"detail":{"number":{"min":1,"max":5}}}}

function parse(input, res = {}, prev = '') {
  return Object.keys(input).reduce((r, e) => {
    let key = prev + (prev && '.') + e, val = input[e]
    if (typeof val == "object" && !Array.isArray(val)) parse(val, res, key)
    else r[key] = input[e]
    return r;
  }, res)
}

let result = parse(data)
console.log(result)