2012-04-11 11 views
14

と一致するかどうかを確認します。underscore.js - 配列の配列内のすべての値が、私は次のようになり、配列の配列、持って

[["Some string", "Some other string"],["Some third string", "some fourth string"]] 

を私はかどうかを判断するためにUnderscore_.all方法を使用することができると思いますすべての配列が100%に一致します(つまり、すべての値が一致します)が、チェックを実行するために必要なイテレータを記述する方法がわかりません。

誰でも知っていますか?

答えて

13

この男(順序に依存しない)試してみてください。

function allArraysAlike(arrays) { 
    return _.all(arrays, function(array) { 
    return array.length == arrays[0].length && _.difference(array, arrays[0]).length == 0; 
    }); 
} 

をこの使用すると、配列のすべてがそうあなたの例の入力のための1つの別の(同じ順序内のすべての同じ要素 を含むようにしたいと仮定しています関数は falseを返す必要があります)。

なぜ交差しないのですか?配列は同じ長さである場合 http://underscorejs.org/#intersection

(あなたは本当にこのためのいくつかの下線の機能を使用する場合)、および交差点の長さは、配列の長さに等しく、そしてそれらはすべて同じ値が含まれています。

+0

で、_を使用したくない場合は? – SuperUberDuper

+1

'_.difference'は、最初の配列の値が2番目の配列に存在しないかどうかをチェックするだけです。第2のアレイ内の付加的な値は検出されない。両方の配列が同じであることを本当に確かめたいなら、 '_を行うべきです。 – rene

29
+1

比較される任意の数の配列に対して 'return _.union(x).length == 1;'を返します。 –

2

あなたは要素が同じで、同じ順序で、私は行くだろうことを確認したい場合は、次のCoffeeScriptでさらにきれいに

arrayEq = function(a, b) { 
    return _.all(_.zip(a, b), function(x) { 
    return x[0] === x[1]; 
    }); 
}; 

arrayEq = (a,b) -> 
    _.all _.zip(a,b), (x) -> x[0]==x[1] 
+1

またはすべての集合に対して(配列、配列[0])長さ== 0 && _.difference(配列[0]、配列).length == 0' –

+0

注文が問題になる場合は、単に '_.isEqual'を使用することができます。 – paulmelnikow

0

あなたはドンが」 tは要素が等しくないを知っておく必要があり、利用の推移:

function allEqual(list) { 
    return _.all(list.slice(1), _.partial(_.isEqual, list[0])); 
} 
allEqual([2, 2, 2, 2]) //=> true 
allEqual([2, 2, 3, 2]) //=> false 
allEqual([false])  //=> true 
allEqual([])   //=> true 
9

アンダースコアを使用して2つの違いを調べ、配列の長さを確認します。これを行う簡単な方法は次のようになります。そうでない場合、彼らは同じとfalseある場合

_.isEmpty(_.difference(array1, array2)) && _.isEmpty(_.difference(array2, array1)) 

これはtrueを返します。

+2

_.isEmpty(_。difference([]、[1,2,3]))はtrueを返しますが、配列は同じではありません。 _.isEmpty(_。差(array1、array2))&& _.isEmpty(_。差(array2、array1)) – wojtekk

+0

よく調べられました。 Stackoverflowは何らかの理由でコメント内のアンダースコアを削除します –

4
_.isEmpty(_.xor(array1, array2)) 
+1

https://lodash.com/docs#xorはlodashですが、アンダースコアではありません。 – paulmelnikow

17

私の好み:

_.isEqual(_.sortBy(first), _.sortBy(second)) 

そして、もし注文事項:私はダン・タオの答えにコメントすることはできません

_(first).isEqual(second) 
0

は、小さな変化がそれ自体に対して最初の配列のチェックをスキップします(不必要_相違電話)

function allArraysAlike(arrays) { 
    return _.all(arrays, function(array) { 
     if(array === arrays[0]) return true; 
     return array.length == arrays[0].length && _.difference(array, arrays[0]).length == 0; 
    }); 
} 
+0

Afaik、2つの配列を=== と比較することはできません。例えば、[4,5] === [4,5]は常に偽です!少なくともクロムに。 – klodoma

+0

私はこのコメントを書いたとき、私は大きくて面倒なWebアプリケーション、さまざまな店舗やモデルなどで作業していました。同じデータ(idsなど)を表す配列があり、配列の一部はコピーであり、違いがないかどうかチェックする必要があります。時々、同じ配列を互いに照合することがあります(参照の場合)。このチェックはここでは、この場合のみ最適化します: '' 'a = [1、... x]; b = a; allArraysAlike([a、b]) '' ' – cotko

1

私の実装はhttp://underscorejs.org/

/** 
* Returns true if the arrays are equal 
* 
* @param {Array} array1 
* @param {Array} array2 
* @returns {boolean} 
*/ 
equal: function (array1, array2) 
{ 
    return (array1.length === array2.length) 
     && (array1.length === _.intersection(array1, array2).length); 
} 
関連する問題