Arm*_*nco 15 javascript jquery json underscore.js knockout.js
我有一个使用JQuery + Knockout的基于AJAX的丰富Web应用程序.我有一个jQuery插件,围绕我的淘汰赛视图模型暴露实用方法,如().reset段,.isDirty() ,等等.
我有一个名为.setBaseline()的方法,它基本上在数据模型填充后(通过映射插件)获取数据模型的快照.然后我可以使用此快照快速确定模型是否已更改.
我正在寻找的是某种通用函数,它可以返回一个对象,该对象表示两个JavaScript对象之间的差异,其中一个对象被认为是主对象.
例如,假设这是我的快照:
var snapShot = {
name: "Joe",
address: "123 Main Street",
age: 30,
favoriteColorPriority: {
yellow: 1,
pink: 2,
blue: 3
}
};
Run Code Online (Sandbox Code Playgroud)
然后假设实时数据如下所示:
var liveData = {
name: "Joseph",
address: "123 Main Street",
age: 30,
favoriteColorPriority: {
yellow: 1,
pink: 3,
blue: 2
}
};
Run Code Online (Sandbox Code Playgroud)
我想要一个返回以下内容的.getChanges(snapShot,liveData)实用程序函数:
var differences = {
name: "Joseph",
favoriteColorPriority: {
pink: 3,
blue: 2
}
};
Run Code Online (Sandbox Code Playgroud)
我希望_.underscore库可能有这样的东西,但我找不到任何看起来像这样的东西.
Ber*_*rgi 17
我不认为下划线中有这样的功能,但它很容易实现:
function getChanges(prev, now) {
var changes = {};
for (var prop in now) {
if (!prev || prev[prop] !== now[prop]) {
if (typeof now[prop] == "object") {
var c = getChanges(prev[prop], now[prop]);
if (! _.isEmpty(c) ) // underscore
changes[prop] = c;
} else {
changes[prop] = now[prop];
}
}
}
return changes;
}
Run Code Online (Sandbox Code Playgroud)
要么
function getChanges(prev, now) {
var changes = {}, prop, pc;
for (prop in now) {
if (!prev || prev[prop] !== now[prop]) {
if (typeof now[prop] == "object") {
if(c = getChanges(prev[prop], now[prop]))
changes[prop] = c;
} else {
changes[prop] = now[prop];
}
}
}
for (prop in changes)
return changes;
return false; // false when unchanged
}
Run Code Online (Sandbox Code Playgroud)
这不适用于Arrays(或任何其他非普通对象)或不同结构的对象(删除,原始到对象类型更改).
| 归档时间: |
|
| 查看次数: |
9996 次 |
| 最近记录: |