web-dev-qa-db-fra.com

underscore.js - Détermine si toutes les valeurs d'un tableau de tableaux correspondent

J'ai un tableau de tableaux, qui ressemble à ceci:

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

Je pense que je peux utiliser la méthode _.all dans Underscore pour déterminer si tous les tableaux correspondent à 100% (c'est-à-dire que leurs valeurs correspondent), mais je ne sais pas comment écrire l'itérateur requis pour exécuter le contrôle .

Quelqu'un a une idée?

18
Kevin Whitaker

Essayez ce type (indépendant de la commande):

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

En supposant que vous souhaitiez que tous les tableaux contiennent les mêmes éléments dans le même ordre les uns comme les autres (donc, pour votre exemple, la fonction devrait renvoyer false).

14
Dan Tao

Pourquoi pas intersection? (si vous voulez vraiment utiliser certaines fonctions de soulignement pour cela) http://underscorejs.org/#intersection

Si les tableaux ont la même longueur et que la longueur de l'intersection est égale à la longueur des tableaux, ils contiennent tous les mêmes valeurs.

31
peterfoldi

Ma préférence:

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

Et si l'ordre est important:

_(first).isEqual(second)
21
paulmelnikow

Utilisez un trait de soulignement pour déterminer la différence entre les deux et vérifiez la longueur du tableau. Un moyen facile de faire cela serait:

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

Ceci retournera true s'ils sont identiques et false s'ils ne le sont pas.

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

Ma mise en œuvre avec 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

Si vous voulez vérifier que les éléments sont les mêmes et dans le même ordre, j'irais avec:

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

Encore plus proprement dans coffeescript:

arrayEq = (a,b) ->
    _.all _.Zip(a,b), (x) -> x[0]==x[1]
2
jazmit

Si vous n'avez pas besoin de savoir quels éléments sont inégaux, utilisez la transitivité:

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

Je ne peux pas commenter la réponse de Dan Tao, petit changement pour ignorer la vérification du premier tableau par rapport à lui-même (appel inutile _.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