6
votes

JavaScript: comparer trois tableaux

Je veux comparer de nombreux tableaux et combiner qui sont identiques: xxx pré>

S'il y a des matrices identiques, je voudrais créer de nouveaux tableaux en dehors des personnes identiques: P >

for (var i in A) {
    for (var j in B) {
        if (A[i] == J[j]) {
            // create new arrays
        }
    }
}


3 commentaires

pour-in iterate sur les touches d'objet. C'est pas A pour chaque boucle et vous ne devez pas l'utiliser sur des tableaux.


@MissingNo Les commentaires sont excellents mais essaient d'expliquer pourquoi quelque chose ne doit pas être utilisé ni fournir un lien s'il vous plaît. Merci.


J'aurais dû être plus explicite. Les tableaux ont d'autres propriétés en plus des index (ceux que vous vous souciez vraiment de) et que vous pouvez également les introduire (à moins que votre navigateur ne se protège de cela). Ceci est spécialement dangereux si vous décidez d'une journée, utilisez une bibliothèque qui modifie une array.ProTotype, comme des mootoques ou des prototypes, et tout à coup, beaucoup de choses parasites commencent à apparaître sur vos boucles. Pour itérer le four, une matrice vous devez utiliser une boucle simple ou l'une des méthodes d'itérations telles que .Foreseach (si cela est pris en charge par votre navigateur / bibliothèques)


6 Réponses :


0
votes

Je le crois, mais à tout le moins que vous pouvez utiliser une fonction de comparaison pour le rendre plus facile, même si c'est juste aussi lent: xxx

alors, il vous suffit de l'utiliser fonction lorsque vous boucle à travers les tableaux.


1 commentaires

Je tiens à noter que j'ai eu cette fonction ailleurs, éventuellement sur Stackoverflow, mais que j'ai longtemps oublié où.



2
votes

Selon votre définition de identique, vous pouvez simplement convertir en chaîne et comparer ceux-ci.

if (A.toString() == B.toString()) { //combine }


0 commentaires

1
votes

Eh bien ... je le ferais de cette façon xxx

ou pour de nombreux tableaux xxx


6 commentaires

@nrabinowitz Je ne vois pas comment c'est différent de l'une des autres approches énumérées. Même dans le vôtre, il boucle autant de fois qu'il y a des tableaux. La seule différence est la vôtre les stocke dans un objet. Le vôtre a également le potentiel de faire plusieurs comparaisons (la partie HASH dans la partie HASHES), ce qui permet de toucher des tableaux plus que le nombre de tableaux existant (par exemple pour 5 tableaux, cela pourrait faire 8 comparaisons). Les miens dans cette situation ne feraient que 5 comparaisons ou même 4 si je l'optimise.


Je comparais seulement les hatupes, pas les tableaux. Ma version est O (n) - pour 5 tableaux, il fabrique 5 recherches de hash-in-objet. Peut-être que je manque quelque chose à propos de votre version - Je ne vois tout simplement pas comment votre approche prend une liste de tableaux et donne une liste de tableaux uniques, ce qui, à mon avis, c'est ce que veut.


Je ne pense pas que cette solution soit correcte; Tout ce que cela fait, c'est vérifier si le premier tableau est égal à tous les autres, et si c'est le cas, il renvoie ce premier tableau.


@Peter c'est ce que l'OP a demandé. L'objectif était de fusionner des matrices identiques. Vous pouvez les comparer comme des chaînes et s'ils sont identiques, il n'y a pas de point réel de la fusion. Vous pouvez simplement retourner le premier.


@Joseph - Oui, mais si vous vouliez Tous des tableaux uniques (que le point unique, je pense), vous auriez besoin de l'exécuter avec chaque tableau dans la séquence, comparant contre tous les autres matrices .


@Joseph, comme exemple, ma compréhension est que cette entrée: [[1,2,3], [1,2,3], [4,5]] devrait renvoyer [ [1,2,3], [4,5]] . Votre solution retournera non défini . Il semble que toute votre solution est vérifiée que chaque réseau d'entrée est exactement la même.



6
votes

Si vous essayez simplement de terminer avec les matrices uniques, j'utiliserais une approche de hachage: xxx


5 commentaires

Vous avez encore des problèmes qui travaillent avec cela sauf un scénario. Crazy, je sais mais c'est comme ça. Pouvez-vous fournir un exemple de jsfiddle qui fonctionne bien?


Vous allez ici: jsfiddle.net/nrabinowitz/l4ekx/1 . J'ai eu une faute de frappe dans mon pour boucle - var i; aurait dû être var i = 0; . Corrigé ci-dessus.


Après divers tests, je dois juste dire que cela fonctionne extrêmement bien! Pour faire des travaux JSON.Stringify avec des navigateurs hérités, tout ce dont je devais ajouter était le Json-JS Mini-Lib de Douglas Crockford. J'ai appelé le fichier JSON2.JS et tout était doré, en particulier dans IE 6/7: Github.com/douglascockford / JSON-JS


Si je pouvais ajouter plus de points pour votre réponse, je le ferais! Merci :)


Heureux que cela fonctionne pour vous! json.stringify est probablement la meilleure fonction de hachage disponible ici, mais vous pourrez peut-être vous éloigner avec un simple .tostring () si vous connaissez que vos tableaux ne tiendront que des numéros ou des cordes.



1
votes

Si vous ne faites que comparer des tableaux de primitifs- numéros ou de chaînes, disez-vous, vous pouvez comparer leur représentation à chaîne.

function simpleArrayMatch(A,B){
    return String{A)===String(B);
}


2 commentaires

Je suis curieux de cette fonction. Pouvez-vous le rincer un peu plus pour que je puisse le voir contexte de travail?


Aucun échantillon Jsfiddle? Fonctionne bien pour un ensemble de tableaux mais qu'en est-il de plusieurs?



1
votes

Supposons que tout ce que vous avez à l'intérieur de chaque matrice sont des chiffres ou des textes seulement, c'est peut-être une approche réalisable sans boucle à travers n'importe quel tableau:

(voir violon ici )

Le code: xxx

stratégie consiste à joindre tout le tableau dans une chaîne avec une chaîne avec "@" comme séparateur. Ensuite, utilisez REGEX pour remplacer toute la pièce dupliquée à l'intérieur de la chaîne, enfin scinder la chaîne, vous avez la liste des matrices uniques de la liste.

La raison d'utiliser une boucle tandis que je ne peux pas écrire Un meilleur modèle de regex pour éliminer la pièce dupliquée à la fois. Vous cherchez une meilleure expression expresse?


0 commentaires