Javascript Lodash isEqual因angular定义的构造函数而失败
我使用Lodash_u2;.isEqual将本地javascript对象与通过$get检索到的另一个javascript对象进行深入比较 此代码表示对象不同:Javascript Lodash isEqual因angular定义的构造函数而失败,javascript,angularjs,constructor,lodash,Javascript,Angularjs,Constructor,Lodash,我使用Lodash_u2;.isEqual将本地javascript对象与通过$get检索到的另一个javascript对象进行深入比较 此代码表示对象不同: $get({...}, function (data) { cleanupAngularProps(data); if (_.isEqual(data, {name: 'Someone'}) { ... } }); 但将其稍微更改如下,现在表明它们是相等的(正如预期的那样): 我调试到Lodash代码中,它似乎失
$get({...}, function (data) {
cleanupAngularProps(data);
if (_.isEqual(data, {name: 'Someone'}) {
...
}
});
但将其稍微更改如下,现在表明它们是相等的(正如预期的那样):
我调试到Lodash代码中,它似乎失败了,因为两个对象都有不同的构造函数
如何在不克隆数据的情况下解决此问题?我不确定这是否是一种好的做法,但我通过重置原型(因此是构造函数)解决了此问题
$get({...}, function (data) {
cleanupAngularProps(data);
data.__proto__ = Object.prototype;
if (_.isEqual(data, {name: 'Someone'}) {
...
}
});
我知道这个问题已经三年了,但我已经找到了一个我认为更能接受的答案。只需排除两个对象之间的原型比较:
var result=\u0.isEqual(
_.省略(数据,['''.'原型]],
_.omit({name:'Someone'},['''u proto']
);代码>如果需要深入比较并忽略构造函数,则可以使用以下代码:
const customizer = (a: any, b: any, key: any) => {
if (_.isObject(a) && _.isObject(b)) {
// @ts-ignore
const aProto = a.__proto__.constructor.name
// @ts-ignore
const bProto = b.__proto__.constructor.name
if (aProto != bProto) {
return _.isEqualWith(_.omit(a, ['__proto__']), _.omit(b, ['__proto__']), customizer)
}
}
return undefined
}
_.isEqualWith({foo:1}, {foo:1}, customizer)
JSON.parse还将删除函数……原始数据可能包含函数,但当您执行JSON.parse(JSON.stringify(data)时
您创建了相同的对象,但没有函数。因此,在第一种情况下,isEqual
返回false,在第二种情况下返回true。cleanupAngularProps
做了什么?您应该能够从angularjs$http请求中获取POJO和原始JSON,这将简化与另一个POJO的比较。@explosion带有$PROMITE和$RESOLVERD。@AlexanderMac我检查过了,它没有“自己的”函数。还删除了proto中定义的所有函数,但它们仍然不同。这是失败的条件:
const customizer = (a: any, b: any, key: any) => {
if (_.isObject(a) && _.isObject(b)) {
// @ts-ignore
const aProto = a.__proto__.constructor.name
// @ts-ignore
const bProto = b.__proto__.constructor.name
if (aProto != bProto) {
return _.isEqualWith(_.omit(a, ['__proto__']), _.omit(b, ['__proto__']), customizer)
}
}
return undefined
}
_.isEqualWith({foo:1}, {foo:1}, customizer)