次のような配列の配列があります。
[["Some string", "Some other string"],["Some third string", "some fourth string"]]
_.all
nderscore のメソッドは、すべての配列が100%一致するかどうか(つまり、すべての値が一致するかどうか)を判別しますが、チェックを実行するために必要なイテレーターを作成する方法がわかりません。
誰かがアイデアを持っていますか?
この人を試してください(順序に依存しない):
function allArraysAlike(arrays) {
return _.all(arrays, function(array) {
return array.length == arrays[0].length && _.difference(array, arrays[0]).length == 0;
});
}
これは、すべての配列にすべて同じ要素を含めることを想定しています 同じ順序で 相互に(したがって、例の入力では、関数はfalse
を返す必要があります)。
なぜ交差しないのですか? (本当にこれにいくつかのアンダースコア関数を使用したい場合) http://underscorejs.org/#intersection
配列が同じ長さであり、交差の長さが配列の長さに等しい場合、すべてに同じ値が含まれます。
私の好み:
_.isEqual(_.sortBy(first), _.sortBy(second))
そして、順序が重要な場合:
_(first).isEqual(second)
アンダースコアを使用して2つの違いを判別し、配列の長さを確認します。これを行う簡単な方法は次のとおりです。
_.isEmpty(_.difference(array1, array2)) && _.isEmpty(_.difference(array2, array1))
同じ場合はtrue
を返し、同じでない場合はfalse
を返します。
_.isEmpty(_.xor(array1, array2))
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);
}
要素が同じで同じ順序であることを確認したい場合は、次のようにします。
arrayEq = function(a, b) {
return _.all(_.Zip(a, b), function(x) {
return x[0] === x[1];
});
};
Coffeescriptでさらにきちんと:
arrayEq = (a,b) ->
_.all _.Zip(a,b), (x) -> x[0]==x[1]
which要素が等しくないことを知る必要がない場合は、推移性を使用します。
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
Dan Taoの回答にはコメントできません。最初の配列のチェック自体をスキップする小さな変更(不要な_.difference呼び出し)
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;
});
}