javascript - 使用 Javascript 将嵌入式 JSON 对象展平为单级数组/对象

标签 javascript json

我正在尝试通过类似这样的无限嵌入级别来展平任何类型的 json 对象:

[
    {
        "one": 1,
        "two": 2,
        "three": [
            {
                "four": 4,
                "five": 5
            },
            {
                "six": 6,
                "seven": 7
            }
        ]
    },
    {
        "one": 1,
        "two": 2
    }
]

变成这样的东西(期望的结果):

{
    "0": {
        "prefix[0]one": 1,
        "prefix[0]three[0]five": 5,
        "prefix[0]three[0]four": 4,
        "prefix[0]three[1]seven": 7,
        "prefix[0]three[1]six": 6,
        "prefix[0]two": 2
    },
    "1": {
        "prefix[1]one": 1,
        "prefix[1]two": 2
    }
}

现在我找到了一个脚本,该脚本在展平数据方面非常有效(良好的起点),但我试图弄清楚如何调整代码,以便将每个顶级数组/对象分组到它自己的数组/对象,而不是像脚本在该页面上所做的那样是一个大的单个对象 (see accepted answer "JSON.flatten")。

这是迄今为止我获得的最简洁的版本,它与原始版本没有太大区别。我已经尝试了比这更多的东西,但它太草率了,无法发布。

JSON.flatten = function(data) {
    var result = {};
    function recurse (cur, prop) {
        if (Object(cur) !== cur) {
            result[prop] = cur;
        } else if (Array.isArray(cur)) {
             for(var i=0, l=cur.length; i<l; i++)
                 recurse(cur[i], prop + "[" + i + "]");
            if (l == 0)
                result[prop] = [];
        } else {
            var isEmpty = true;
            for (var p in cur) {
                isEmpty = false;
                recurse(cur[p], prop ? prop+p : p);
            }
            if (isEmpty && prop)
                result[prop] = {};
        }
    }
    recurse(data, "prefix");
    return result;
}

这是当前代码产生的结果:

{
    "prefix[0]one": 1,
    "prefix[0]three[0]five": 5,
    "prefix[0]three[0]four": 4,
    "prefix[0]three[1]seven": 7,
    "prefix[0]three[1]six": 6,
    "prefix[0]two": 2,
    "prefix[1]one": 1,
    "prefix[1]two": 2
}

注意:我不一定需要使用提供的示例代码。任何达到预期结果的代码都可以。

谢谢大家!

更新:

我意识到我想要的输出需要更像这样:

{
    "0": {
        "prefix[0][one]": 1,
        "prefix[0][three][0][five]": 5,
        "prefix[0][three][0][four]": 4,
        "prefix[0][three][1][seven]": 7,
        "prefix[0][three][1][six]": 6,
        "prefix[0][two]": 2
    },
    "1": {
        "prefix[1][one]": 1,
        "prefix[1][two]": 2
    }
}

但即使在使用 CViejo 的建议将其设置为这样的格式后,我最终还是发现由于嵌套对象,这完全行不通。它们也必须是无限级别的对象。所以我接受了 Tomalak 的建议并尝试递归方法并在我进行时分配值。我只是想感谢你们提供了一些很好的建议!

最佳答案

我看不出调整已经按照它说的正确的扁平化功能有什么意义。相反,既然您只想格式化数据(无论出于何种原因),为什么不格式化扁平化输出以满足您的需要呢?

function formatFlat(obj, prefix){

    var result = {};

    for (var key in obj) {  

        var newKey = key.replace(prefix + "[", "").split("]")[0];

        if(!result[newKey]){
            result[newKey] = {};
        }

        result[newKey][key] = obj[key];
    }

    return result;
}

这样调用它:

console.log( formatFlat(JSON.flatten(yourData), "prefix") );

关于javascript - 使用 Javascript 将嵌入式 JSON 对象展平为单级数组/对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32242423/

相关文章:

javascript - 使用 fnRowCallback 自定义 DT

javascript - 如何获取由 css 设置的元素的字体大小

Javascript:时间格式 HH:MM 的正则表达式

javascript - 对 API 的 JSON 数据的跨源请求 - "You may need an appropriate loader to handle this file type."

django - Django REST Framework 中的命名 JSON 数组

python - 如何在Python中将字符串转换为字节?

javascript - Jquery 显示/隐藏 div onclick 单选按钮 - 根本不起作用

javascript - 如何从javascript访问 react 内联样式

json - IIS 8 阻止 JSON 有效负载字段的请求

c# - 反序列化 API 调用的 JSON 响应时出现问题。 .NET 6