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是的,我看到了。你有什么建议?考虑到我的树不会像我的示例中那样复杂。你可以编写一个递归函数,逐节点遍历旧树,与新树进行比较,当发现差异时,将该节点添加到集合中,并在最后通知集合。同样值得指出的是:如果数组的顺序发生变化,这将显示出一种不同。惊人的工作,这是艺术,感谢你给出了这个奇妙的例子,我将把它分解,看看它是如何工作的