配列の比較(deep)

HTML

<ul>
 <li><a href="https://teratail.com/questions/316641#reply-440996">JavaScript - 配列の比較方法(ロジックを理解したいだけなので言語は特に問いません)|teratail</a></li>
</ul>

JavaScript

function compare(a, b){
  // everyは、配列を走査し、コールバックによって、falseを返した時、走査を終了し、そのままfalseを返す配列メソッド
  // 全ての走査が、trueだった場合はtrueを返す
  return a.every((ae, ai) => {
    // 両方配列だった場合は再帰実行
    if (Array.isArray(ae) && Array.isArray(b[ai])) {
      return compare(ae, b[ai]);
    } else {
      // 配列でないがオブジェクトの時は、オブジェクト用の処理
      if (typeof ae == 'object' && typeof b[ai] == 'object' ) {
        return Object.entries(ae).every(aei => {
          // entriesは、オブジェクトデータ型をキー別に配列として返すメソッド
          if (typeof b[ai][aei[0]] == 'undefined') {
            // bにそもそもキーが存在しなければ、違うのでfalseを返す
            return false;
          } else {
            // オブジェクトの要素が両方配列の場合、再帰実行
            if (Array.isArray( aei[1] ) && Array.isArray( b[ai][aei[0]] ) ) {
              return compare(aei[1], b[ai][aei[0]]);
            } else {
              // プリミティブ値の場合、そのまま比較
              return aei[1] === b[ai][aei[0]];
            }
          }

        });
      }
      // ここまでくると、プリミティブ値同士なのでそのまま比較
      return ae === b[ai];
    }
  });
}

console.log(compare(['A',undefined], ['A'])); // true