7

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
}
3
  • 2
    See stackoverflow.com/questions/201183/… for ways to check if objects are equal. Then just use one of those techniques in the loop. Commented Jun 18, 2020 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. Commented Jun 18, 2020 at 23:55
  • @AlexanderNied no i don't want to use libraries, and no no nested objects and values not always scalar Commented Jun 18, 2020 at 23:59

2 Answers 2

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

Sign up to request clarification or add additional context in comments.

3 Comments

If you switch the position of a and b in one object like { b: 2, a: 1 } it'll return false.
yes i was writing that comment the moment i saw yours @Armamedia
@EhsanNazeri this will not work as OP as wanted if you have [{a: 1, b: 2}, {a: 1, b: 2, c: 3}, {a:2, b: 1 }] like this. just FYI
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.

2 Comments

Unfortunately the user indicated in the comments that outside libraries are not acceptable.
The OP said he does want to use libraries. So this will not help.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.