web-dev-qa-db-ja.com

underscore.js-配列の配列内のすべての値が一致するかどうかを確認します

次のような配列の配列があります。

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

_.allnderscore のメソッドは、すべての配列が100%一致するかどうか(つまり、すべての値が一致するかどうか)を判別しますが、チェックを実行するために必要なイテレーターを作成する方法がわかりません。

誰かがアイデアを持っていますか?

19
Kevin Whitaker

この人を試してください(順序に依存しない):

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

これは、すべての配列にすべて同じ要素を含めることを想定しています 同じ順序で 相互に(したがって、例の入力では、関数はfalseを返す必要があります)。

14
Dan Tao

なぜ交差しないのですか? (本当にこれにいくつかのアンダースコア関数を使用したい場合) http://underscorejs.org/#intersection

配列が同じ長さであり、交差の長さが配列の長さに等しい場合、すべてに同じ値が含まれます。

31
peterfoldi

私の好み:

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

そして、順序が重要な場合:

_(first).isEqual(second)
21
paulmelnikow

アンダースコアを使用して2つの違いを判別し、配列の長さを確認します。これを行う簡単な方法は次のとおりです。

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

同じ場合はtrueを返し、同じでない場合はfalseを返します。

11
Craig Myles
_.isEmpty(_.xor(array1, array2))
4
Ron

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);
}
2
klodoma

要素が同じで同じ順序であることを確認したい場合は、次のようにします。

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]
2
jazmit

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
0
chbrown

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;
    });
}
0
cotko