3
votes

Le moyen le plus rapide de comparer 2 objets dans js

Quel est le moyen le plus rapide de comparer 2 objets en javascript?

Par exemple j'ai ces 2 objets:

for (var i = 0; i < a.length; i++) {
    for (var j = 0; j < b.length; j++) {
        console.log(a[i]) // => [{'name': 'john', 'age': 22}, {'name': 'anne', 'age': 12}]
    }
}

Normalement, je ferais ceci:

a = [{'name': 'john', 'age': 22}, {'name': 'mike', 'age': 23}, {'name': 'anne', 'age': 12}, {'name': 'dan', 'age': 29}, {'name': 'jane', 'age': 34}]
b = [{'name': 'john', 'age': 22}, {'name': 'anne', 'age': 12}]

Cela prend trop de temps, y a-t-il un autre moyen plus rapide? Merci pour votre temps!


7 commentaires

Qu'entendez-vous par «comparer»? Voulez-vous voir s'ils sont exactement identiques? Si tel est le cas, vous pouvez faire JSON.stringify(a) === JSON.stringify(b) .


Ce sont des tableaux d'objets. Que voulez-vous exactement comparer? Tableaux ou objets?


Fondamentalement, je veux vérifier si un élément de a est dans b , puis définir une valeur a[i].checked = true


@RobertAKARobin Ne faites pas cela car JSON.stringify({a:1,b:1}) === JSON.stringify({b:1,a:1}) dépend de l'implémentation (notez l'ordre des propriétés modifié) .


Avec la structure de données dont vous disposez, vous devrez parcourir les tableaux. Pour un algorithme plus efficace, choisissez une meilleure structure de données.


Créer un ou plusieurs hashmap (s) serait plus efficace


Votre titre est trompeur, vous ne comparez pas réellement 2 objets dans JS, vous semblez chercher un moyen de calculer l'union (ou l'intersection) de deux tableaux. Peut-être que Set est plus approprié


3 Réponses :


8
votes

Vous pouvez jeter un œil au package fast-deep-equal . Voici un benchmark de performance de leur README.md pour votre référence.

fast-deep-equal x 226,960 ops/sec ±1.55% (86 runs sampled)
nano-equal x 218,210 ops/sec ±0.79% (89 runs sampled)
shallow-equal-fuzzy x 206,762 ops/sec ±0.84% (88 runs sampled)
underscore.isEqual x 128,668 ops/sec ±0.75% (91 runs sampled)
lodash.isEqual x 44,895 ops/sec ±0.67% (85 runs sampled)
deep-equal x 51,616 ops/sec ±0.96% (90 runs sampled)
deep-eql x 28,218 ops/sec ±0.42% (85 runs sampled)
assert.deepStrictEqual x 1,777 ops/sec ±1.05% (86 runs sampled)
ramda.equals x 13,466 ops/sec ±0.82% (86 runs sampled)
The fastest is fast-deep-equal


0 commentaires

-2
votes

a = [{'name': 'john', 'age': 22}, {'name': 'mike', 'age': 23}, {'name': 'anne', 'age': 12}, {'name': 'dan', 'age': 29}, {'name': 'jane', 'age': 34}]
b = [{'name': 'john', 'age': 22}, {'name': 'anne', 'age': 12}]

var areTheyEqual = JSON.stringify(a) === JSON.stringify(b) ;

console.log('Are they equal: ' + areTheyEqual)


1 commentaires

la séquence de propriétés donnera des résultats différents dont je ne pense pas que ce soit exact



0
votes
let a={a:20,b:10};
let b={b:10,a:20};

console.log(Object.entries(a).sort().toString()===
            Object.entries(b).sort().toString()) //true

2 commentaires

peut également ajouter quelques lignes de texte parlant de la solution que vous avez fournie


Oui. Veuillez fournir une explication simple de ce que fait le code pour aider l'OP à comprendre la solution. Merci!