isEqual 与 isMatch - isMatch 是否忽略嵌套数组元素的顺序?

Aks*_*ure 3 node.js lodash

我使用lodash来比较以下两个对象:

obj1 = {
    "_id": "57767",
    "Re": {
        "PropertyTypes": [
            {
                "AllocationID": 13870,
                "Percentage": null,
                "Type": "Hotels",
                "Value": null
            },
            {
                "AllocationID": 13867,
                "Percentage": null,
                "Type": "Industrial",
                "Value": null
            }
        ]
    }
}

obj2 = {
    "_id": "57767",
    "Re": {
        "PropertyTypes": [
            {
                "AllocationID": 13867,
                "Percentage": null,
                "Type": "Industrial",
                "Value": null
            },
            {
                "AllocationID": 13870,
                "Percentage": null,
                "Type": "Hotels",
                "Value": null
            }
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现使用isEqual(obj1, obj2),比较失败,使用isMatch(obj1, obj2),则效果很好。

我想知道 和 是否isEqualisMatch完全相同的方式工作,除了在这种情况PropertyTypes下忽略数组元素的顺序这一事实之外isMatch我在isMatch 的文档中没有找到此信息。

Sto*_*law 5

不确定“以完全相同的方式工作”是什么意思,但这是我的理解:

  • _.isMatch_.isEqual共享相同的内部逻辑,使用显式的部分无序_isMatch标志调用所述底层逻辑(所以我想我们可以说它们的工作方式完全相同
  • 我想说,通常_isMatch用于断言输入对象(例如配置)至少可能事先没有完全正确地成形,而_.isEqual处理最纯粹、最严格的比较
  • 由于这种类似于验证的行为,还存在部分标志的概念,考虑到您显示的数据,这可能是一个陷阱,例如:
obj1 = {
  a: 123,
  b: 456,
  c: 789
};
obj2 = {
  a: 123,
  b: 456
}
_.isMatch(obj1, obj2); // true, `c` wasn't "asserted"
_.isMatch(obj2, obj1); // false, missing value for `c`
Run Code Online (Sandbox Code Playgroud)

将其扩展到更接近您的情况的示例,因为这是一个深入的比较:

obj1 = {
  PropertyTypes: [{
    id: 13867
  }, {
    id: 13870
  }]
};
obj2 = {
  PropertyTypes: [{
    id: 13867
  }, {
    id: 13870
  }, {
    id: 11111
  }]
};
_.isMatch(obj1, obj2); // false, missing 11111 value
_.isMatch(obj2, obj1); // true, even though there's one more item in the array
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!