Lodash isEqual 由于 angular 定义的构造函数而失败
Lodash isEqual fails because of constructor defined by angular
我正在使用 Lodash _.isEqual 将本地 javascript 对象与通过 angular $get.
检索到的另一个 javascript 对象进行深度比较
此代码表示对象不同:
$get({...}, function (data) {
cleanupAngularProps(data);
if (_.isEqual(data, {name: 'Someone'}) {
...
}
});
但稍微修改一下,现在说它们相等(正如预期的那样):
$get({...}, function (data) {
cleanupAngularProps(data);
if (_.isEqual(JSON.parse(JSON.stringify(data)), {name: 'Someone'}) {
...
}
});
我调试了 Lodash 代码,它似乎失败了,因为两个对象有不同的构造函数。
如何在不克隆数据的情况下解决这个问题?
我不确定这是否是一个好的做法,但我通过重置原型解决了这个问题,因此重置了构造函数。
$get({...}, function (data) {
cleanupAngularProps(data);
data.__proto__ = Object.prototype;
if (_.isEqual(data, {name: 'Someone'}) {
...
}
});
我知道这个问题已经有 3 年历史了,但我找到了我认为更容易接受的答案。简单排除两个对象的原型比较:
var result = _.isEqual(
_.omit(data, ['__proto__']),
_.omit({name: 'Someone'}, ['__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)
我正在使用 Lodash _.isEqual 将本地 javascript 对象与通过 angular $get.
检索到的另一个 javascript 对象进行深度比较此代码表示对象不同:
$get({...}, function (data) {
cleanupAngularProps(data);
if (_.isEqual(data, {name: 'Someone'}) {
...
}
});
但稍微修改一下,现在说它们相等(正如预期的那样):
$get({...}, function (data) {
cleanupAngularProps(data);
if (_.isEqual(JSON.parse(JSON.stringify(data)), {name: 'Someone'}) {
...
}
});
我调试了 Lodash 代码,它似乎失败了,因为两个对象有不同的构造函数。
如何在不克隆数据的情况下解决这个问题?
我不确定这是否是一个好的做法,但我通过重置原型解决了这个问题,因此重置了构造函数。
$get({...}, function (data) {
cleanupAngularProps(data);
data.__proto__ = Object.prototype;
if (_.isEqual(data, {name: 'Someone'}) {
...
}
});
我知道这个问题已经有 3 年历史了,但我找到了我认为更容易接受的答案。简单排除两个对象的原型比较:
var result = _.isEqual(
_.omit(data, ['__proto__']),
_.omit({name: 'Someone'}, ['__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)