如何检查两个对象数组是否等于 javascript?

How can i check if two arrays of objects are equal with javascript?

我有两个要比较的对象数组。如果数组具有相同的对象,即使它们的顺序不同,则数组是相等的。例如:

  [
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12 ',  height: 190},
   { name: 'jhon', value: '50', height: 176 }
  ]
  
    //and

  [
   { name: 'jhon', value: '50', height: 176 },
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12 ',  height: 190}
  ]  
   //equals 

相等但

  [
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12 ',  height: 190},
   { name: 'jhon', value: '50', height: 176 }
   
  ]
  
    //and

  [
   { name: 'jhon', value: '50', height: 176 },
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12 ',  height: 190},
   { name: 'Mark', value: '50', height: 140 }
  ]
      //not equal

   [
    { name: 'Lisa', value: '25', height: 165 },
    { name: 'jack',  value: '12 ',  height: 190},
    { name: 'jhon', value: '50', height: 176 }

  ]

//and

[
 { name: 'jhon', value: '50' },
 { name: 'Lisa', value: '25', height: 165 },
 { name: 'jack',  value: '12 ',  height: 190},

]
//not equals 

最后一个例子中的两个数组不相等,因为它们没有完全相同的对象。我尝试了很多不需要展示的东西,因为我还没有接近 javascript 谢谢你的帮助:)

此处可能的答案是对数组进行排序(基于一些 属性 以便在第二步中完美匹配)和 stringify 数组进行比较。

function areArrayEqual(arrayA, arrayB) {
  if (arrayA.length !== arrayB.length) {
    return false;
  }

  return JSON.stringify(arrayA) === JSON.stringify(arrayB);
}

在这里,检查长度,然后排序和比较。

const arr1 = [
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12 ',  height: 190},
   { name: 'jhon', value: '50', height: 176 }
  ];
const arr2 =   [
   { name: 'jhon', value: '50', height: 176 },
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12 ',  height: 190}
  ]; 
const arr3 =  [
   { name: 'jhon', value: '50', height: 176 },
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12 ',  height: 190},
   { name: 'Mark', value: '50', height: 140 }
  ];
const arr4 =   [
   { name: 'jhon', value: '50', height: 176, extraField: 1 },
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12 ',  height: 190}
  ]; 
  
const sortByName = (arr) => arr.sort(({ name: a}, {name: b}) => (a > b) ? 1 : (a < b) ? -1 : 0 ); 

const objEqual = (objA, objB) => {
  const keys = [...new Set(Object.keys(objA).concat(Object.keys(objB)))];
  if (keys.length !== Object.keys(objA).length) return false;
  return keys.every(k => objA[k] === objB[k]);
}

const areEqual = (arrA, arrB) => {
  if (arrA.length !== arrB.length) return false;
  const a = sortByName(arrA);
  const b = sortByName(arrB);
  
  return a.every((obj, i) => objEqual(obj, b[i]));
};

console.log(areEqual(arr1, arr2));
console.log(areEqual(arr1, arr3));
console.log(areEqual(arr1, arr4));

测试后的另一个选项Length。就是用一个Set.

const arr1 = [
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12',  height: 190},
   { name: 'jhon', value: '50', height: 176 }
  ];
const arr2 =   [
   { name: 'jhon', value: '50', height: 176 },
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12',  height: 190}
  ]; 
const arr3 =  [
   { name: 'jhon', value: '50', height: 176 },
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12',  height: 190},
   { name: 'Mark', value: '50', height: 140 }
  ];
const arr4 =   [
   { name: 'jhon', value: '50', height: 176, extraField: 1 },
   { name: 'Lisa', value: '25', height: 165 },
   { name: 'jack',  value: '12 ',  height: 190}
  ]; 
  
const getKey = (obj) => {
  return Object.keys(obj).map(k => `${k}:${obj[k]}`).join('');
};
 
const areEqual = (arr1, arr2) => {
  // First test length
  if(arr1.length !== arr2.length) return false;
  
  // Now lets grab a sets
  const names = new Set(arr1.concat(arr2).map((obj) => getKey(obj)));

  // now check Set length === arr1.length
  return (names.size * 2) === arr1.length + arr2.length;         
};

console.log(areEqual(arr1, arr2));
console.log(areEqual(arr1, arr3));
console.log(areEqual(arr1, arr4));