6

How to check if all objects in an array contains same keys and values

const arrOfObjects = [{a: 1, b: 2}, {a: 1, b: 2}, {a:1, b: 2 }] // true

const arrOfObjects = [{a: 1, b: 2}, {a: 1, b: 2}, {a:2, b: 1 }] //false

const arrOfObjects = [{a: 1, b: 2}, {a: 1, b: 2, c: 3}, {a:2, b: 1 }] //false

This is my trial that looks so ugly and bad and not working, i would be thankful if someone put an efficient code for that problem!

function test(arr){

   const firstItem = arr[0];
   const firstItemKeys = Object.keys(firstItem);

   for(let i = 0; i < firstItemKeys.length; i++) {
      for(let j = 0; j < arr.length; j++) {
         for(let x in arr[j]) {
             if(arr[j][x] !== firstItem[firstItemKeys[i]]) return false
         }
       }
   }

   return true
}
Code Eagle
  • 1,293
  • 1
  • 17
  • 34
  • 2
    See https://stackoverflow.com/questions/201183/how-to-determine-equality-for-two-javascript-objects for ways to check if objects are equal. Then just use one of those techniques in the loop. – Barmar Jun 18 '20 at 23:53
  • 2
    Some important restrictions for this question: Are outside libraries acceptable? Are the objects always a single level deep, or might they be nested? Can you confirm if values will always be scalar values? These will be important considerations for answering this to your requirements. – Alexander Nied Jun 18 '20 at 23:55
  • @AlexanderNied no i don't want to use libraries, and no no nested objects and values not always scalar – Code Eagle Jun 18 '20 at 23:59

2 Answers2

3

Here is the code:

const arrOfObjects = [
  { a: 1, b: 2 },
  { a: 1, b: 2 },
  { b: 2, a: 1 },
]
function areEquals(a, b) {
  var keys1 = Object.keys(a)
  var keys2 = Object.keys(b)
  if(keys1.length !== keys2.length) {
    return false ;
  }
  for(key in a) {
    if(a[key] !== b[key])  return false;
  }
  return true ;
}
function checkArray(arr) {
  for (var i = 1; i < arr.length; i++) {
    if (!areEquals(arr[0], arr[i])) return false
  }
  return true
}
console.log(checkArray(arrOfObjects))
Rahul Bhobe
  • 4,165
  • 4
  • 17
  • 32
Ehsan Nazeri
  • 771
  • 1
  • 6
  • 10
2

If you can use lodash, then there is method _.isEqual

const _ = require('lodash')
const arrOfObjects = [{a: 1, b: 2}, {a: 1, b: 2}, {a:1, b: 2 }]
let isEqual = true
arrOfObjects.forEach(obj => {
  if (!_.isEqual(arrOfObjects[0], obj)) {
    isEqual = false
  } 
})

return isEqual

PS: This could be written in one line with reduce, but it will not be readable for anyone new to programming or javascript.

libik
  • 22,239
  • 9
  • 44
  • 87