【问题标题】:Checking for equal objects inside of array (Javascript) [duplicate]检查数组内的相等对象(Javascript)[重复]
【发布时间】:2018-01-07 13:53:59
【问题描述】:

我目前正在使用 Mocha 运行测试,以检查对象、数组和数组内对象的相等性。尽管在我的测试的“对象”部分中,我的最后一个测试目前失败了,但我传入了两个相似的对象并且它们通过了。

const compareObjects = function(a, b){

  for(var prop in a){
    if(a[prop] === b[prop] !== true){
      return false;
    }
  }
  return true;
}

const compareArrays = function(a, b){

  if(a.length !== b.length){
    return false;
  }

  for(var i = 0; i < a.length; i++){

    //checking for objects inside of arrays here
    if(typeof a[i] === 'object' && typeof b[i] === 'object'){
      if(compareObjects(a[i], b[i]) !== true){
        return false;
      }
    } else if (a[i] !== b[i]){
      return false;
    }
  }

  return true;
}

这失败了 -

  describe('Arrays', function() {
    it('should return false when comparing two objects inside of 
    arrays with different number of keys', function() {

      var arr1 = [
        {
          name: 'Janet',
          age: 25,
        }
      ]
      var arr2 = [
        {
          name: 'Janet',
          age: 25,
          hairColor: 'brown'
        }
      ]

      assert.equal(false, compareArrays(arr1, arr2));
    });

  });

这通过了 -

  describe('Objects', function() {
    it('should return false when there is a different number of 
    keys', function() {

      var obj1 = {name: 'Janet', age: 25, hair: 'brown'}
      var obj2 = {name: 'Janet', age: 25}

      assert.equal(false, compareObjects(obj1, obj2));
    });
 }); 

【问题讨论】:

  • (a[i] !== b[i]) 将始终通过,因为操作数不是指同一个对象。
  • CompareObjects 仅遍历 A 中的属性并检查 B 中是否存在相同的属性。您还应该将Object.keys(a).lengthObject.keys(b).length 进行比较

标签: javascript arrays object mocha.js equality


【解决方案1】:

作弊!使用JSON.stringify 并比较字符串。

const a = {
  foo: "foo",
  bar: "bar",
  foobar: {
    says: "meow"
  }
};
const b = {
  foo: "foo",
  bar: "bar",
  foobar: {
    says: "meow"
  }
};
const c = {
  foo: "foo",
  bar: "baz",
  foobar: {
    says: "meow"
  }
};

const compareObjects = function(a, b) {
  for (var prop in a) {
    if (a[prop] === b[prop] !== true) {
      return false;
    }
  }
  return true;
}

const compareObjectsCheat = function(a, b) {
  return JSON.stringify(a) === JSON.stringify(b);
}

console.log(compareObjects(a, b));
console.log(compareObjects(a, c));

console.log(compareObjectsCheat(a, b));
console.log(compareObjectsCheat(a, c));

【讨论】:

  • 啊,Teemu 链接到最佳答案。
猜你喜欢
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多