配列の比較(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