javascript - 解析 JSON 中的引用 : Javascript/JSON

标签 javascript angularjs json

我有以下来自服务器的示例 JSON。重复对象在内部由 id 引用(请参阅下面的 JSON)。

[
  { "id": 1,
    "agent": {
      "id": 1,
      "firstName": "gghg",
      "lastName": "gh",
      "phone": "4543534",
      "admin": true
    },
    "user":"agent@gmail.com"
  },
  { "id": 2,
    "agent": 1, // here I want the full object and not the Id
    "user":"agent1@gmail.com"
  }
]

问题: 在给定随机 JSON 对象的情况下,如何解析以这种方式引用的对象?

(例如,对于上面的示例 JSON,我将得到以下输出:)

[
  { "id": 1,
    "agent": {
      "id": 1,
      "firstName": "gghg",
      "lastName": "gh",
      "phone": "4543534",
      "admin": true
    },
    "user":"agent@gmail.com"
  },
  { "id": 2,
    "agent": {
      "id": 1,
      "firstName": "gghg",
      "lastName": "gh",
      "phone": "4543534",
      "admin": true
    },
    "user":"agent1@gmail.com"
  }
]

最佳答案

基本上是一个单循环提案,它收集未解析的链接,如果找到它,它会用对象替换开放部分。

var data = [{ "id": 1, "agent": { "id": 1, "firstName": "gghg", "lastName": "gh", "phone": "4543534", "admin": true }, "user": "agent@gmail.com" }, { "id": 2, "agent": 1, "user": "agent1@gmail.com" }];

data.forEach(function (a) {
    if (typeof a.agent === 'object') {
        this[a.agent.id] = this[a.agent.id] || {};
        this[a.agent.id].data = a.agent;
        this[a.agent.id].update && this[a.agent.id].update.forEach(function (b) {
            b.agent = a.agent;
        });
        return;
    } 
    this[a.agent] = this[a.agent] || {};
    if (this[a.agent].data) {
        a.agent = this[a.agent].data;
        return;
    }
    this[a.agent].update = this[a.agent].update || [];
    this[a.agent].update.push(a);
}, Object.create(null));

console.log(data);

编辑,未知属性引用的更通用版本。

var data = [
        { id: 1, agent: { id: 1, firstName: "gghg", lastName: "gh", phone: "4543534", admin: true }, user: "agent@gmail.com", abc: 2 },
        { id: 2, agent: 1, user: "agent1@gmail.com", abc: { id: 2, text: 'blabla' } },
        { id: 3, agent: { id: 1, firstName: "gghg", lastName: "gh", phone: "4543534", admin: true }, user: "agent@gmail.com" },
    ];

data.forEach(function (a) {
    Object.keys(a).forEach(function (k) {
        if (typeof a[k] === 'object' && 'id' in a[k]) {
            this[a[k].id] = this[a[k].id] || {};
            this[a[k].id].data = a[k];
            this[a[k].id].update && this[a[k].id].update.forEach(function (b) {
                b[k] = a[k];
            });
            return;
        }
        this[a[k]] = this[a[k]] || {};
        if (this[a[k]].data) {
            a[k] = this[a[k]].data;
            return;
        }
        this[a[k]].update = this[a[k]].update || [];
        this[a[k]].update.push(a);
    }, this);
}, Object.create(null));

console.log(data);

关于javascript - 解析 JSON 中的引用 : Javascript/JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38372769/

相关文章:

javascript - 使用 JQuery 导航无根 dom

javascript - knockout 计算的可观察值未触发 'write'

javascript - 如何在 JavaScript 中比较跨时区的日期?

asp.net - 服务器端asp.net上的angularjs渲染

c# - 用对象数组修补对象

java - 如何在java中创建通用的json响应对象?

javascript - 如何停止页面重定向

javascript - ajax 调用后更新 Kendo Grid 内容

javascript - 选项没有显示在我的选择标签中 | Angular 和 ionic

json - 用于更新 JSON 中的模型值的 Ruby 代码