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?
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
).
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.
Ma préférence:
_.isEqual(_.sortBy(first), _.sortBy(second))
Et si l'ordre est important:
_(first).isEqual(second)
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.
_.isEmpty(_.xor(array1, array2))
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);
}
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]
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
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;
});
}