javascript - 比较对象并删除相等的值
问题描述
我希望能够比较两个对象并删除值未更改的属性。
prevObject = {
isActive: true,
userName: 'Patric',
settings: {
isUser: true
}
}
nextObject = {
isActive: true,
userName: 'Patric Surname',
settings: {
isUser: false
}
}
上面比较的结果应该是:
{
userName: 'Patric Surname',
settings: {
isUser: false
}
}
我已经尝试了一些 for in 循环等,但我还没有让它递归地工作。抱歉,我没有任何代码可以证明我已经尝试过了。我把它扔了,因为我有点沮丧。我也坚持使用纯 ES5。所以没有lodash或下划线:)
会很高兴得到一些帮助!
解决方案
您将需要一种递归方法:
在 ECMAScript-5 语法中:
function isObject(a) {
return typeof a === "object" && a;
}
function diff(a, b) {
var res = b instanceof Array ? [] : {};
for (var prop in b) {
if (!(prop in a) || (!isObject(a[prop]) || !isObject(b[prop])) && a[prop] !== b[prop]) {
res[prop] = b[prop];
} else {
var obj = diff(a[prop], b[prop]);
// If the recursive result is not an empty object, then use it
for (var _ in obj) {
res[prop] = obj;
break; // We only need 1 iteration
}
}
}
return res;
}
var prevObject = {isActive: true,userName: 'Patric',settings: {isUser: true }};
var nextObject = { isActive: true,userName: 'Patric Surname',settings: {isUser: false}};
console.log(diff(prevObject, nextObject));
此函数对数组的支持有限。只有当它们的内容和它们在数组中出现的索引相同时,数组元素才被认为是相同的。这意味着结果数组可能有间隙(“稀疏”)。
推荐阅读
- c# - 在发出 WaitHandle 或类似类的信号时,有没有办法对值/结果进行编码?
- php - Woocommerce RESTful API 的字符串格式
- java - 尝试获取联系人时的 Microsoft Graph NoPermissionsInAccessToken
- excel - 如何连续搜索“匹配”?
- prestashop-1.7 - 如何更改 ISO 以及 hreflang 配置到 Prestashop 1.7 的位置
- ios - 在加载时将 @State 变量从 UserDefaults 更改为值而不更新 Picker
- spree - 从 rails 控制台更新大礼包产品的价格
- flutter - 在颤动中更改文本输入的值
- python - python:获取从 __all__ 变量导入的对象
- angularjs - 隐藏元素时如何防止AngularJs将模型值设置为null?