Nesting Structure Comparison

Nesting Structure Comparison

Complete the method to return true when its argument is an array that has the same nesting structure as the first array.

// For example
// should return true
[1, 1, 1].sameStructureAs([2, 2, 2]);
[1, [1, 1]].sameStructureAs([2, [2, 2]]);

// should return false
[1, [1, 1]].sameStructureAs([[2, 2], 2]);
[1, [1, 1]].sameStructureAs([[2], 2]);

// should return true
[[[], []]].sameStructureAs([[[], []]]);

// should return false
[[[], []]].sameStructureAs([[1, 1]]);

For your convenience, there is already a function 'isArray(o)' declared and defined that returns true if its argument is an array, false otherwise.

배열의 prototype method를 만드는 문제입니다. method의 인수로 전달받은 배열이 method를 호출한 배열과 같은 구조를 가지고 있으면 true, 그렇지 않으면 false를 반환합니다. 저의 풀이 과정은 아래와 같습니다.

- 배열을 loop를 돌아 각 요소마다 접근을 합니다. - 두 배열의 동일한 위치의 두 요소가 배열이 아니면, 다음 요소로 넘어갑니다. - 배열인지 아닌지는 Array.isArray method를 활용합니다. - 두 요소 중 한 개만 배열이면 false를 반환합니다. - 둘 다 배열이면, 그 배열의 안쪽으로 들어가 다시 위의 과정을 확인하는 반복문을 실행합니다. - 마지막까지 false가 없으면, true를 반환합니다.

Array.prototype.sameStructureAs = function(other) {
  if (this.length !== other.length) {
    return false;
  }

  for (let i = 0; i < this.length; i++) {
    if (Array.isArray(this[i]) !== Array.isArray(other[i])) {
      return false;
    }

    if (Array.isArray(this[i])) {
      const isSame = this[i].sameStructureAs(other[i]);

      if (!isSame) {
        return false;
      }
    }
  }

  return true;
};

위 알고리즘을 풀고 추천을 많이 받은 코드를 참고해 보았습니다. 그 중 아래 코드는 짧게 작성되었지만, 문제의 조건 중 놓친 부분이 있었습니다. 배열의 길이로만 true, false를 판단하기 때문에 각 배열의 길이만 같고 요소의 data type이 다른 경우 분간을 하지 못 합니다.

대부분 남의 코드를 읽고 놀란 경우만 있었는데, 살다보니 이렇게 버그를 발견하는 날도 있군요.. : )

Array.prototype.sameStructureAs = function(other) {
  return this.length === other.length
    ? this.every(function(el, i) {
        return Array.isArray(el) ? el.sameStructureAs(other[i]) : true;
      })
    : false;
};