web-dev-qa-db-ja.com

2つの配列の値が同じかどうかを知る方法

これら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番目の配列にないかを知るにはどうすればよいですか?

81
Carlos Precioso
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;

}

これは、以前の回答とは異なり、元の配列を変更しないことに注意してください。

17
Maciej Krawczyk

配列項目がオブジェクトではない場合(たとえば、数値または文字列の場合)、結合された文字列を比較して、それらが任意の順序で同じメンバーを持っているかどうかを確認できます

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');
74
kennebec
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();
}

多分?

42
isakkarlsson

2つの配列が同じ値を持っているかどうか(各値の出現回数と順序に関係なく)だけをチェックする場合は、 lodash を使用してこれを行うことができます。

_.isEmpty(_.xor(array1, array2))

短く、シンプルでかわいい!

40
Technotronic

オブジェクトの等価性チェック:JSON.stringify(array1.sort()) === JSON.stringify(array2.sort())

上記のテストは、オブジェクトの配列でも機能します。この場合、 http://www.w3schools.com/jsref/jsref_sort.asp に記載されているソート関数を使用します。

フラットなJSONスキーマを持つ小さな配列で十分な場合があります。

7
Sandeep

これらの2つの配列を比較すると、コンテンツではなく、配列を表すオブジェクトが比較されます。

この2つを比較するには、関数を使用する必要があります。単純にループし、長さが同じであることを確認した後、他のループと比較する独自のコードを作成できます。

3
Andrew

基本的に、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は配列であると仮定していることに注意してください。

2
canbax

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!");
}
1
Erfan

ES6を使用する

Ramdaのequals関数を使用しますが、代わりにLodashまたはUnderscoreのisEqualを使用できます。

const R = require('ramda');

const arraysHaveSameValues = (arr1, arr2) => R.equals( [...arr1].sort(), [...arr2].sort() )

スプレッド演算子を使用して、元の配列の変更を避け、関数を純粋に保ちます。

1
Ben Carp

配列内の項目がプリミティブ(数字または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
}
0
Stefan Musarra

親切にこの答えを確認してください

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;
    }
}
}
0
Vinoth