Javascript 如何只获得;改为;来自两个JSON对象的值

Javascript 如何只获得;改为;来自两个JSON对象的值,javascript,jquery,json,Javascript,Jquery,Json,这是一个涉及到更复杂的比较方式的问题,因此它不是重复的 我已经创建了一个,当用户更改其树结构时,应该比较“旧的”JSON和“新的”JSON结构,并且应该只显示已更改的JSON的值 例如: [{"name":"node1","id":1,"is_open":true,"children": [ {"name":"child1","id":2}, {"name":"child2","id":3} ] }] 在客户端将child1放在child2下之后 [{

这是一个涉及到更复杂的比较方式的问题,因此它不是重复的

我已经创建了一个,当用户更改其树结构时,应该比较“旧的”
JSON
和“新的”
JSON
结构,并且应该只显示已更改的
JSON
的值

例如:

[{"name":"node1","id":1,"is_open":true,"children":
    [
      {"name":"child1","id":2},
      {"name":"child2","id":3}
    ]
}]

在客户端将
child1
放在
child2
下之后

[{"name":"node1","id":1,"is_open":true,"children":
  [
    {"name":"child2","id":3},
    {"name":"child1","id":2}
  ]
}]

我只想比较它们,检查哪些值已更改,并用
警报显示它们,在本例中,警报是:

{“name”:“child2”,“id”:3},
{“name”:“child1”,“id”:2}

到目前为止,我有一个比较它们的小代码:

[{"name":"node1","id":1,"is_open":true,"children":
    [
      {"name":"child1","id":2},
      {"name":"child2","id":3}
    ]
}]
//我知道它不太可靠

但我正在寻找一种可以检查“差异”并从JSON中提取出来的东西

提前谢谢。

给你:

为您的无点击乐趣编辑的下一版本:

// Call this function.
// The others are helpers for this one.
function getDiff(a, b){
    var diff = (isArray(a) ? [] : {});
    recursiveDiff(a, b, diff);
    return diff;
}

function recursiveDiff(a, b, node){
    var checked = [];

    for(var prop in a){
        if(typeof b[prop] == 'undefined'){
            addNode(prop, '[[removed]]', node);
        }
        else if(JSON.stringify(a[prop]) != JSON.stringify(b[prop])){
            // if value
            if(typeof b[prop] != 'object' || b[prop] == null){
                addNode(prop, b[prop], node);
            }
            else {
                // if array
                if(isArray(b[prop])){
                   addNode(prop, [], node);
                   recursiveDiff(a[prop], b[prop], node[prop]);
                }
                // if object
                else {
                    addNode(prop, {}, node);
                    recursiveDiff(a[prop], b[prop], node[prop]);
                }
            }
        }
    }
}

function addNode(prop, value, parent){
        parent[prop] = value;
}

function isArray(obj){
    return (Object.prototype.toString.call(obj) === '[object Array]');
}
有关更多详细信息,请参阅上面的链接。有一条评论解释了我的一些假设

这是一个如何使用递归来解决问题的示例。如果你不熟悉递归,我建议你读一些书。这里有一篇关于它的文章:

注意:
像我那样使用
JSON.stringify
不是一个好主意。作为程序员,这对我来说很方便,因为我的程序可以“向前看”,看看每条路径上是否有变化,但这是有代价的。我已经在遍历来完成我的工作,而且
JSON.stringify
还遍历我每次调用发送的每个对象的树结构。在计算机科学中,我们称之为O(n!)的最坏情况,不太正式地称之为“非常慢”。更好的设计只是遍历整个树,并跟踪它是如何到达它所在的位置的。当它遇到死胡同(称为“叶”节点)时,它将使用这些知识一次性向
diff
变量添加必要的数据结构。这意味着我们的程序必须遍历整个数据结构,但我们的代码将是唯一执行此操作的对象。因此每个节点只处理一次


不过,这应该会让您了解其他人的建议。

计算两种数据结构之间的差异并不是一件简单的事情。@Pointy确实很尖锐,但要将它们转换为不同的“类型”并不容易“,然后比较?例如,如果我将它们转换为字符串,就像字符串化一样。我很抱歉,如果这听起来很愚蠢,那么你可以这样做,但是你会得到一个字符串差异;换句话说,一个字符一个字符的差异。现在,您面临着用数据结构来解释结果的问题,据我所知,数据结构就是所涉及的实际模型。@Pointy是的,我看到了。你有什么建议?考虑到我的树不会像我的示例中那样复杂。你可以编写一个递归函数,逐节点遍历旧树,与新树进行比较,当发现差异时,将该节点添加到集合中,并在最后通知集合。同样值得指出的是:如果数组的顺序发生变化,这将显示出一种不同。惊人的工作,这是艺术,感谢你给出了这个奇妙的例子,我将把它分解,看看它是如何工作的