Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Lodash isEqual因angular定义的构造函数而失败_Javascript_Angularjs_Constructor_Lodash - Fatal编程技术网

Javascript Lodash isEqual因angular定义的构造函数而失败

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代码中,它似乎失

我使用Lodash_u2;.isEqual将本地javascript对象与通过$get检索到的另一个javascript对象进行深入比较

此代码表示对象不同:

$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)