繁体   English   中英

如何检查两个 arrays 对象是否与 javascript 相等?

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

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

  [
   { 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 

最后一个示例中的两个 arrays 不相等,因为它们没有完全相同的对象。 我尝试了很多没有必要展示的东西,因为我什至没有接近,因为我是 javascript 的初学者,谢谢你的帮助:)

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

 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));

这里可能的答案可能是对数组进行排序(基于某些属性以便在第二步中完美匹配)并将数组stringify以进行比较。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM