【问题标题】:Jquery doesn't extend external json files [duplicate]Jquery不扩展外部json文件[重复]
【发布时间】:2016-03-02 17:53:45
【问题描述】:

下面的函数看起来是正确的,但它工作不正确

$.when(
    $.getJSON('compare/As_edit.json'), $.getJSON('compare/As_old.json'))
    .then(function (a,b) {
        //return $.extend(a, b);
        console.log($.extend(a, b));
    })

在控制台日志中我看到:

Object {text: "As", icon: "icons/tree.png", children: Array[1]}

虽然它应该是“children: Array2

我的文件看起来像:

文件1

{
  "text": "As",
  "icon": "icons/tree.png",
  "children": [
    {
      "text": "Class1",
      "children": [
        {
          "text": "Intern1",
          "-ORDER": "2",
          "children": [
            {
              "name": "--TRT",
              "text": "Name of Intern"
            }
          ]
        },
        {
          "text": "Intern2",
          "-ORDER": "2",
          "children": [
            {
              "name": "--TRT",
              "text": "Name of Intern"
            }
          ]
        }
      ]
    }
  ]
}

文件2

{
  "text": "As",
  "icon": "icons/tree.png",
  "children": [
    {
      "text": "Class2",
      "children": [
        {
          "text": "Intern3",
          "-ORDER": "2",
          "children": [
            {
              "name": "--TRT",
              "text": "Name of Intern"
            }
          ]
        },
        {
          "text": "Intern4",
          "-ORDER": "2",
          "children": [
            {
              "name": "--TRT",
              "text": "Name of Intern"
            }
          ]
        }
      ]
    }
  ]
}

我想在输出中看到

{
  "text": "As",
  "icon": "icons/tree.png",
  "children": [
    {
      "text": "Class1",
      "children": [
        {
          "text": "Intern1",
          "-ORDER": "2",
          "children": [
            {
              "name": "--TRT",
              "text": "Name of Intern"
            }
          ]
        },
        {
          "text": "Intern2",
          "-ORDER": "2",
          "children": [
            {
              "name": "--TRT",
              "text": "Name of Intern"
            }
          ]
        }
      ]
    },
    {
      "text": "Class2",
      "children": [
        {
          "text": "Intern3",
          "-ORDER": "2",
          "children": [
            {
              "name": "--TRT",
              "text": "Name of Intern"
            }
          ]
        },
        {
          "text": "Intern4",
          "-ORDER": "2",
          "children": [
            {
              "name": "--TRT",
              "text": "Name of Intern"
            }
          ]
        }
      ]
    }
  ]
}

但我只从 file2 中的对象获取输出 怎么了?

这是一个fiddle 示例

Merge 2 arrays of objects 上检查参考后,我使用了下一个代码

 $.when(
        $.getJSON('compare/Astella_edit.json'), $.getJSON('compare/Astella_old.json'))
        .then(function (a,b) {
            var arr3 = [];
            for (var i in a) {
                var shared = false;
                for (var j in b)
                    if (b[j].children == a[i].children) {
                        console.log('['+ (b[j].children == a[i].children) +']');
                        shared = true;
                        break;
                    }
                if (!shared) arr3.push(a[i])
            }
            arr3 = arr3.concat(b);
            console.log(arr3);
            //return arr3;
        })

它几乎正确地合并到我身上

[Object, Object, "success", Object]

所以第一个对象是file1,第二个是file2

生成的 JSON 中的“成功”是什么意思,第三个对象来自哪里?

【问题讨论】:

  • 尝试 console.log()-ing a 和 b 分别查看回调函数返回的内容
  • 你需要做深度扩展...阅读文档...试试$.extend(true,a, b)
  • @glcheetham,控制台显示 a - [Object, "success", Object]" 和 file1 内,对于 b - "[Object, "success", Object]" 在 file2 内
  • @charlietfl,深度扩展也一样
  • 使用示例数据创建演示

标签: javascript jquery arrays json


【解决方案1】:

您期望 $.extend 会自动神奇地 合并您的 children 数组:

/*file1*/ {"children" : ["a"]}

$.extend编辑

/*file2*/ {"children": ["b"]}

永远不会变成:

/*result*/ {"children": ["a", "b"]}

这不是 $.extend 的工作方式
结果将永远是:/*result*/ {"children": ["b"]}

以此为例:

var ob1 = {
  a : ["a"],
  b : ["b"]
};
var ob2 = {
  a : ["a"],
  b : ["XXX"],
  c : ["c"]
};
$.extend(ob1, ob2);
console.log( ob1 ); // {a: ["a"], b:["XXX"], c:["c"]}

如您所见,$.extend 实际上是“扩展”并使用来自ob2 对象的值更新了对象ob1,但属性b 确实n't变成了@ 987654336@

如何合并两个对象数组Merge 2 arrays of objects

【讨论】:

  • 非常感谢您的解释。有什么方法可以合并吗?
  • 谢谢,我已经阅读了这些链接,不幸的是 underscore.js 不适用于外部文件。将尝试更深入地学习...
  • 请检查更新的问题
  • @Anton 参考:api.jquery.com/jquery.when。 TLDR; when's .than() 使用三个回调,您对 ab (每个三个响应状态)不感兴趣,但实际上在第一个 data 响应:a[0]b[0]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 2018-02-24
  • 2012-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多