对象的深度比较



我写了此功能以深入比较JavaScript中的两个对象

Equal: function(obj1, obj2) {
  var keys1 = Object.keys(obj1).sort();
  var keys2 = Object.keys(obj2).sort();
  if (keys1.length !== keys2.length) {
    return false;
  }
  // first make sure have same keys.
  if (!keys1.every(function(k, i) {
    return (k === keys2[i]);
  })) {
    return false;
  }
  return keys1.every(function(kk) {
    var v1 = obj1[kk];
    var v2 = obj2[kk];
    if (Array.isArray(v1)) {
      return this.EqualArr(v1, v2);
    } else if (typeof v1 === "object" && v1 !== null) {
      return this.Equal(v1, v2);
    } else {
      return v1 === v2;
    }
  });
},

但是我有一个错误:

无法将未定义或无效转换为对象

问题发生在此行:

var keys2 = Object.keys(obj2).sort(); 

任何人可以帮我吗?

由于您已经在使用UI5框架,因此可以使用内置比较器jQuery.sap.equal

jquery.sap.equal(a,b,maxdepth? 比较两个给定值的平等值,尤其是小心不要通过参考比较数组和对象,而是比较它们的内容。

这是一个示例:

sap.ui.require([
  "jquery.sap.global"
], jQuery => console.log(jQuery.sap.equal({
  a: "I'm A",
  b: {
    property: "I'm B",
    c: {
      property: "I'm C",
      array: [1, 2, 3],
      date: new Date("2018-02-28"),
    },
  },
}, {
  a: "I'm A",
  b: {
    property: "I'm B",
    c: {
      property: "I'm C",
      array: [1, 2, 3],
      date: new Date("2018-02-28"),
    },
  },
})));
console.clear();
<script id="sap-ui-bootstrap" src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js"></script>

  • UI5实际比较两个给定对象
  • 其他测试用例

这里的问题是调用Object.keys

此方法不接受nullundefined作为参数。为了避免您可以检查传递的对象不是虚假的。

if (!obj1 && !obj2) {
  return false
}

最新更新