두개의 배열이 같은 값을 갖고 있는지 비교하는 방법에 대해서 알아보겠습니다.

배열의 동등 비교를 할 때 다음 두가지를 고려하여 비교할 수 있습니다.

  • 두 배열이 서로 같은 값을 갖고 있지만, 저장 순서는 다를 때
  • 두 배열이 서로 같은 값을 갖고 있고, 저장 순서도 같음

1. for문으로 두 배열의 값과 순서를 모두 비교

for문으로 두 배열을 순회하면서, 동일한 순서(Index)로 저장되고, 같은 값을 갖고 있는지 확인할 수 있습니다.

for문으로 Index와 값을 모두 비교하는게 직관적이고, 정석적인 방법이지만 비교하는 코드가 좀 길 수 있습니다.

function arraysAreEqual(arr1, arr2) {
  if (arr1.length !== arr2.length) {
    return false;
  }

  for (let i = 0; i < arr1.length; i++) {
    if (arr1[i] !== arr2[i]) {
      return false;
    }
  }

  return true;
}

let array1 = [1, 2, 3];
let array2 = [1, 2, 3];
let array3 = [1, 2, 4];

console.log(arraysAreEqual(array1, array2)); // true
console.log(arraysAreEqual(array1, array3)); // false

Output:

true
false

toString()과 === 연산자로 비교

문자열이나, 숫자 배열의 경우 toString() 값이 배열 값의 내용을 문자열로 변환하여 리턴합니다.

이런 경우 === 연산자로 문자열의 내용이 같은지 비교하여, 배열이 같은지 비교할 수 있습니다. 주의할 점은 toString()이 배열의 내용을 출력하지 않고, 객체의 주소 값을 출력하는 경우, 비교할 수 없습니다.

let array1 = [1, 2, 3];
let array2 = [1, 2, 3];
let array3 = [1, 2, 4];

console.log(array1);
console.log(array2);
console.log(array3);

if (array1.toString() === array2.toString()) { // true
  console.log("array1 is equal to array2");
}

if (array2.toString() === array3.toString()) { // false
  console.log("array2 is equal to array3");
}

Output:

[ 1, 2, 3 ]
[ 1, 2, 3 ]
[ 1, 2, 4 ]
array1 is equal to array2

2. Array.every()로 두 배열의 값과 순서를 모두 비교

Array.every(함수)는 배열의 모든 요소에 대해서 함수를 수행하며, 모두 true일 때 every()는 true를 리턴합니다. 즉, 모든 조건이 만족하는지 확인할 때 사용합니다. 아래 arraysAreEqual() 함수 같이, 배열의 길이를 비교하고, every()로 다른 배열에 동일 위치에 같은 값이 있는지 확인할 수 있습니다.

  • arr1.every((value, index) => value === arr2[index]) : arr1의 index의 value가 arr2에도 동일 index에 갖고 있는지 확인
function arraysAreEqual(arr1, arr2) {
  return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
}

let array1 = [1, 2, 3];
let array2 = [1, 2, 3];
let array3 = [1, 2, 4];

console.log(arraysAreEqual(array1, array2)); // true
console.log(arraysAreEqual(array1, array3)); // false

Output:

true
false

3. Array.every()로 두 배열의 값만 비교

위의 예제와 비슷한데, every()에서 Index와 value를 비교하지 않고, 다른 배열에 value가 포함되어있는지 여부만 includes() 함수로 체크합니다.

따라서, 저장 순서가 달라도 동일한 값을 갖고 있다면, 두 배열은 같다고 판단이 됩니다.

function arraysAreEqual(arr1, arr2) {
  return (
    arr1.length === arr2.length &&
    arr1.every((value, index) => arr2.includes(value))
  );
}

let array1 = [1, 2, 3];
let array2 = [1, 2, 3];
let array3 = [1, 2, 4];
let array4 = [3, 2, 1];

console.log(arraysAreEqual(array1, array2)); // true
console.log(arraysAreEqual(array1, array3)); // false
console.log(arraysAreEqual(array1, array4)); // true

Output:

true
false
true