由于angular定义的构造函数,Lodash isEqual失败

时间:2016-05-02 19:08:41

标签: javascript angularjs constructor lodash

我正在使用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代码,它似乎失败了,因为两个对象都有不同的构造函数。

如何在不克隆数据的情况下解决这个问题?

3 个答案:

答案 0 :(得分:0)

我不确定这是不是一个好习惯,但我通过重置原型来解决它,因此构造函数。

$get({...}, function (data) {

  cleanupAngularProps(data);

  data.__proto__ = Object.prototype;

  if (_.isEqual(data, {name: 'Someone'}) {
    ...
  }
});

答案 1 :(得分:0)

我知道这个问题目前已经存在3年了,但是我发现我认为这是一个更可接受的答案。只需排除两个对象之间的原型比较:

var result = _.isEqual(
  _.omit(data, ['__proto__']),
  _.omit({name: 'Someone'}, ['__proto__'])
);

答案 2 :(得分:0)

如果你需要深度比较而忽略构造函数,那么你可以使用这段代码:

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)