我正在尝试在 javascript 中的两个对象之间创建一个“补丁”,以便仅在一个变量中更新数据。
var patch = {};
var o = {
id: 'p1',
kind: 'product',
title: 'ProductTitle',
price: 100,
stock: 10,
};
var n = {
title: 'ProductTitleRenamed',
price: 100,
stock: 20,
};
var patchExpected = {
title: 'ProductTitleRenamed',
stock: 20,
};
我使用 vanilla/lodash 方法在jsperf上尝试了多种场景,但我不明白为什么最后一个与其他方法相比如此缓慢(我猜它与字符串访问有关)。原始版本在逻辑上更快(有很多 if)但它真的很冗长,你知道其他优雅和高性能的解决方案(使用 immutablejs、es6 map 等)吗?
在 Chrome 58.0.3029 / Mac OS X 10.12.4 中测试
1 - 在新对象属性上使用 lodash 循环 (3,006,759 ops/s)
_.forEach(n, (value, key) => {
if (value !== o[key]) {
patch[key] = value;
}
});
2 - 有很多 if (17,873,849 ops/s)
if (!_.isUndefined(n.id) && o.id !== n.id) {
patch.id = n.id;
}
if (!_.isUndefined(n.kind) && o.kind !== n.kind) {
patch.kind = n.kind;
}
if (!_.isUndefined(n.title) && o.title !== n.title) {
patch.title = n.title;
}
if (!_.isUndefined(n.price) && o.price !== n.price) {
patch.price = n.price;
}
if (!_.isUndefined(n.stock) && o.stock !== n.stock) {
patch.stock = n.stock;
}
3 - 如果使用 util 函数“isChanged”(15,146,180 ops/s),则有很多
function isChanged(n, o) {
return !_.isUndefined(n) && o !== n;
}
if (isChanged(n.id, o.id)) {
patch.id = n.id;
}
if (isChanged(n.kind, o.kind)) {
patch.kind = n.kind;
}
if (isChanged(n.title, o.title)) {
patch.title = n.title;
}
if (isChanged(n.price, o.price)) {
patch.price = n.price;
}
if (isChanged(n.stock, o.stock)) {
patch.stock = n.stock;
}
4 - 一个差异函数(不那么冗长)(4,360,005 ops/s)
function diff(field) {
if (!_.isUndefined(n[field]) && o[field] !== n[field]) {
patch[field] = n[field];
}
}
diff('id');
diff('kind');
diff('title');
diff('price');
diff('stock');