javascript - 解析带键 JSON 对象的最佳方法

标签 javascript jquery json

我有从 API(无法更改)发送给我的对象,这些对象遵循这种类型的模式:

{
  aaa: {
    name: "Aaa",
    desc: "..."
  },
  bbb: {
    name: "Bbb",
    desc: "..."
  },
  ccc: {
    name: "Ccc",
    desc: "...",
    stuff: {
      foo: {
        bar: "bar"
      },
      keys: ["foo"]
    }
  },
  keys: ["aaa", "bbb", "ccc"]
}

我想做的是将这些对象“扁平化”为客户端上更可用的对象。所以压平上面的对象的结果将是:

[
  {
    key: "aaa",
    name: "Aaa",
    desc: "..."
  },
  {
    key: "bbb",
    name: "Bbb",
    desc: "..."
  },
  {
    key: "ccc",
    name: "Ccc",
    stuff: [
      { key: "foo", bar: "bar" }
    ]    
  }
]

如您所见,我需要遍历 2 个级别的数据。 目前我正在循环并创建新对象(下面简要说明),我只是想知道是否有更优雅的方法来处理这个问题?

var myObjs = [];

$(data.keys).each(function(i, objKey) {
  i = $.extend({}, data[objKey], { key: objKey });
  myObjs.push(i);
});

最佳答案

这似乎可以满足您的要求:

function flatten(obj) {
    return $.map(obj.keys, function(key) {
        var res = $.extend({}, obj[key], {key: key});
        for (var key in res) {
            if (typeof res[key] === 'object') {
                res[key] = flatten(res[key]);
            }
        }
        return res;
    });
}

参见http://jsfiddle.net/alnitak/pgq2S/

注意:只要您有嵌套对象,这就会继续递归 - 它目前不会停止在两层。

关于javascript - 解析带键 JSON 对象的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15117906/

相关文章:

javascript - 防止表单输入中出现双字节数字

javascript - 如何正确地将 jQuery 和 Bootstrap 加载到 Joomla 中?

php - 如何让数组和 session 变量在浏览器刷新后恢复为空白?

javascript - MVC : Plugging a C++ Model into a Web-based View

javascript - 如何在单个 HTML 页面中对表单元素使用 OR (||)

javascript - AddRow 和 Popup 的功能未按预期工作

jquery - 页面重定向后显示特定的 div

javascript - 如何在水平滚动Jquery上实现延迟加载

java - 在Java中解析JSON url

json - 第 1 行解析错误 : { #networkports "l ----------^ Expecting ' STRING', '}'