对象的深度比较

时间:2018-03-26 09:02:57

标签: javascript sapui5

我写了这个函数来深入比较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;
    }
  });
},

但我收到了这个错误:

  

无法将undefined或null转换为对象

问题出现在这一行:

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

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

这里的问题是对Object.keys

的调用

此方法不接受nullundefined作为参数。为了避免这种情况,你可以检查传递的对象是不是假的。

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

答案 1 :(得分:2)

由于您已经在使用UI5框架,因此可以使用built-in comparator 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>