これら2つの配列があります。1つはajaxリクエストからの情報で満たされ、もう1つはユーザーがクリックしたボタンを格納します。このコードを使用します(サンプル番号を入力しました):
var array1 = [2, 4];
var array2 = [4, 2]; //It cames from the user button clicks, so it might be disordered.
array1.sort(); //Sorts both Ajax and user info.
array2.sort();
if (array1==array2) {
doSomething();
}else{
doAnotherThing();
}
ただし、2つの配列が同じでも名前が異なる場合でも、常にfalse
が返されます。 (ChromeのJS Consoleでこれを確認しました)。だから、これらの2つの配列に同じものが含まれているかどうかを知ることができる方法はありますか?なぜfalse
を与えるのですか?最初の配列のどの値が2番目の配列にないかを知るにはどうすればよいですか?
function arraysEqual(_arr1, _arr2) {
if (!Array.isArray(_arr1) || ! Array.isArray(_arr2) || _arr1.length !== _arr2.length)
return false;
var arr1 = _arr1.concat().sort();
var arr2 = _arr2.concat().sort();
for (var i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i])
return false;
}
return true;
}
これは、以前の回答とは異なり、元の配列を変更しないことに注意してください。
配列項目がオブジェクトではない場合(たとえば、数値または文字列の場合)、結合された文字列を比較して、それらが任意の順序で同じメンバーを持っているかどうかを確認できます
var array1= [10, 6, 19, 16, 14, 15, 2, 9, 5, 3, 4, 13, 8, 7, 1, 12, 18, 11, 20, 17];
var array2= [12, 18, 20, 11, 19, 14, 6, 7, 8, 16, 9, 3, 1, 13, 5, 4, 15, 10, 2, 17];
if(array1.sort().join(',')=== array2.sort().join(',')){
alert('same members');
}
else alert('not a match');
Array.prototype.compare = function(testArr) {
if (this.length != testArr.length) return false;
for (var i = 0; i < testArr.length; i++) {
if (this[i].compare) { //To test values in nested arrays
if (!this[i].compare(testArr[i])) return false;
}
else if (this[i] !== testArr[i]) return false;
}
return true;
}
var array1 = [2, 4];
var array2 = [4, 2];
if(array1.sort().compare(array2.sort())) {
doSomething();
} else {
doAnotherThing();
}
多分?
2つの配列が同じ値を持っているかどうか(各値の出現回数と順序に関係なく)だけをチェックする場合は、 lodash を使用してこれを行うことができます。
_.isEmpty(_.xor(array1, array2))
短く、シンプルでかわいい!
オブジェクトの等価性チェック:JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())
上記のテストは、オブジェクトの配列でも機能します。この場合、 http://www.w3schools.com/jsref/jsref_sort.asp に記載されているソート関数を使用します。
フラットなJSONスキーマを持つ小さな配列で十分な場合があります。
これらの2つの配列を比較すると、コンテンツではなく、配列を表すオブジェクトが比較されます。
この2つを比較するには、関数を使用する必要があります。単純にループし、長さが同じであることを確認した後、他のループと比較する独自のコードを作成できます。
基本的に、2つの配列が等しいセットであるかどうかを確認することです。ここで、setは数学的な set を意味します。最速のソートは、漸近的にO(nlog(n))時間かかります。辞書データ構造を使用して、これを漸近的にO(n)時間で実行できます。 JSでは、辞書は単にキーと値を持つオブジェクトです。
// assumes array elements are primitive types
function areArraysEqualSets(a1, a2) {
let superSet = {};
for (let i = 0; i < a1.length; i++) {
const e = a1[i] + typeof a1[i];
superSet[e] = 1;
}
for (let i = 0; i < a2.length; i++) {
const e = a2[i] + typeof a2[i];
if (!superSet[e]) {
return false;
}
superSet[e] = 2;
}
for (let e in superSet) {
if (superSet[e] === 1) {
return false;
}
}
return true;
}
この関数はプリミティブ型の配列で機能し、a1とa2は配列であると仮定していることに注意してください。
Gameプロジェクトに単純な整数値がありました
各配列の値の数が少なかったため、元の配列をそのまま使用する必要がありました
だから、私は以下を行いました、それはうまくいきました。 (ここに貼り付けるために編集されたコード)
var sourceArray = [1, 2, 3];
var targetArray = [3, 2, 1];
if (sourceArray.length !== targetArray.length) {
// not equal
// did something
return false;
}
var newSortedSourceArray = sourceArray.slice().sort();
var newSortedTargetArray = targetArray.slice().sort();
if (newSortedSourceArray.toString() !== newSortedTargetArray.toString()) { // MAIN CHECK
// not equal
// did something
return false;
}
else {
// equal
// did something
// continued further below
}
// did some more work
return true;
お役に立てば幸いです。
Prototype Frameworkを使用している場合、配列の intersect メソッドを使用して、それらが同じであることを(順序に関係なく)見つけることができます。
var array1 = [1,2];
var array2 = [2,1];
if(array1.intersect(array2).length === array1.length) {
alert("arrays are the same!");
}
Ramdaのequals
関数を使用しますが、代わりにLodashまたはUnderscoreのisEqual
を使用できます。
const R = require('ramda');
const arraysHaveSameValues = (arr1, arr2) => R.equals( [...arr1].sort(), [...arr2].sort() )
スプレッド演算子を使用して、元の配列の変更を避け、関数を純粋に保ちます。
配列内の項目がプリミティブ(数字または1文字)の場合、長さの比較とセットの使用を組み合わせて使用できます。
function equalArrayItems(arr1, arr2) {
if (arr1.length !== arr2.length) return false
const set1 = new Set(arr1)
const set2 = new Set(arr2)
const set3 = new Set(arr1, arr2)
return set1.size === set3.size && set2.size === set3.size
}
親切にこの答えを確認してください
var arr1= [12,18];
var arr2= [12, 18, 20, 11, 19, 14, 6, 7, 8, 16, 9, 3, 1, 13, 5, 4, 15, 10, 2, 17];
for(i=0;i<arr1.length;i++)
{
var array1=arr1[i];
for(j=0;j<arr2.length;j++)
{
var array2=arr2[j];
if(array1==array2)
{
return true;
}
}
}