持っているかどうかを確認する方法arrays
はarray
?
var arrays = [[1, 1], [2, 2]];
var array = [1,1];
[1, 1] === [1, 1]; // false
arrays.includes(array); // false
arrays.indexOf(array); // -1
持っているかどうかを確認する方法arrays
はarray
?
var arrays = [[1, 1], [2, 2]];
var array = [1,1];
[1, 1] === [1, 1]; // false
arrays.includes(array); // false
arrays.indexOf(array); // -1
indexOfは、厳密な等式(===
)を使用して比較します。要素はまったく同じオブジェクトである必要があります。
それで
var a = [1,1];
var b = [a,[1,2]];
b.indexOf(a)// 0
なぜならa === a
しかし
b.indexOf([1,1])// -1
[1,1]はそれとは異なるオブジェクトでa
あるため、厳密には等しくありません。
やりたいことをするためには、もっと複雑なことをする必要があります。値をループして、この質問の回答にあるもののようなものを使用して比較を行うことができます
indexOf
配列に一致するものが見つからない場合は-1を返します。配列a
に要素が含まれていませんb
。
編集:
@JonathanLonowskiが言ったことを明確にするために、一致がない理由は、値ではなく参照を比較して厳密な比較を行っているためです。
<Array>.some
メソッドは、多次元配列内の少なくとも1つの配列が、提供された関数によって実装されたテストに合格するかどうかをテストします。
<Array>.every
メソッドは、配列内のすべての配列項目が、提供された関数によって実装されたテストに合格するかどうかをテストします。
これらの2つの方法を組み合わせると、多次元配列の配列のすべての項目が、求めているものの価値があるかどうかを確認できます。
const checkArray = (arrays, array) => arrays.some(a => {
return (a.length > array.length ? a : array).every((_, i) => a[i] === array[i]);
});
const arrays = [[0, 1], [2, 2], [0, 3, 2, 1]];
[
[0, 1], // true
[2, 2], // true
[0, 3, 2, 1], // true
[1, 0, 3, 2, 1], // false
[2, 2, 1], // false
[0, 0], // false
[1, 2], // false
[0, 1, 2] // false
].forEach(array => {
console.log(checkArray(arrays, array));
});