Kyl*_*yle 2 javascript jquery json
这是一个涉及更复杂的比较方式的问题,因此它不是重复的
我创建了一个JqTree,当用户更改其树结构时,应该比较"旧" JSON和"新" JSON结构,并且应该仅显示JSON已更改的值.
例如:
[{"name":"node1","id":1,"is_open":true,"children":
[
{"name":"child1","id":2},
{"name":"child2","id":3}
]
}]
Run Code Online (Sandbox Code Playgroud)

之后,客户端已经把child1下child2
[{"name":"node1","id":1,"is_open":true,"children":
[
{"name":"child2","id":3},
{"name":"child1","id":2}
]
}]
Run Code Online (Sandbox Code Playgroud)

我只想比较它们并检查哪些值已更改并用a显示它们alert,在这种情况下,它将是:
{"name":"child2","id":3},
{"name":"child1","id":2}
到目前为止,我有这个比较它们的小代码:
JSON.stringify(object1)=== JSON.stringify(object2); //我知道它不太可靠
但我正在寻找能够检查"差异"并从JSON中提取它的东西.
提前致谢.
你去:http: //jsfiddle.net/musicin3d/cf5ddod1/3/
编辑版本以获得无需点击的乐趣:
// 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]');
}
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅上面的链接.有一条评论解释了我的一些假设.
这是如何使用递归来解决问题的示例.如果你不熟悉递归,我建议你做一些阅读.这是一篇关于它的SO文章: 什么是递归,什么时候应该使用它?
值得注意的是:像我一样
使用JSON.stringify并不是一个好主意.作为程序员,这对我来说很方便,因为我的程序可以"向前看"以查看每条路径是否有变化,但这需要付出代价.我已经遍历树结构来完成我的工作,并且JSON.stringify 还遍历每次调用它时发送的每个对象的树结构.在计算机科学中,我们称之为O(n n)的最坏情况,不太正式地称为"非常慢".更好的设计只会遍历整个树,并跟踪它到达的位置.当它到达一个死胡同(称为"叶子"节点")时,它会利用这些知识diff一次性将所需的数据结构添加到变量中.这意味着我们的程序必须遍历整个数据结构,但是我们的代码是唯一这样做的.所以每个节点只会被处理一次.
不过,这应该可以让你了解别人的建议.
| 归档时间: |
|
| 查看次数: |
3799 次 |
| 最近记录: |