Alors tout d'abord, voici un simple extrait de code pour montrer ce que je veux dire exactement et ce que j'ai essayé.

let array_1 = [
    { id: 1, name: 'Peter'   },
    { id: 2, name: 'John'    },
    { id: 3, name: 'Andrew'  },
    { id: 4, name: 'Patrick' },
    { id: 5, name: 'Brian'   }
];

let array_2 = [
    { id:  1, name: 'not Peter'   },
    { id: 80, name: 'not John'    },
    { id:  3, name: 'not Andrew'  },
    { id: 40, name: 'not Patrick' },
    { id:  5, name: 'not Brian'   }
];

array_1.forEach(item_1 => {
    for (let i = 0; i < array_2.length; i++) {
        item_1.matches = array_2[i].id === item_1.id
    }
});

console.log('matched_array', array_1);

Le but ici est d'ajouter la propriété matches à chaque objet de array_1 et de la définir sur true / false, selon que le id correspond à un autre id de array_2.

Dans cet exemple actuel, le résultat des propriétés matches doit ressembler à ceci: true - false - true - false - true. Mais mon code actuel ne définit correctement cette propriété que dans le dernier élément du tableau (array_1). De toute évidence, c'est parce que mon code n'est pas tout à fait correct, et c'est là que je suis bloqué.

1
K. P. 29 août 2020 à 12:06

2 réponses

Meilleure réponse

Vous pouvez d'abord créer un objet avec la méthode reduce que vous pouvez ensuite utiliser comme table de hachage pour vérifier si l'élément avec le même identifiant existe dans le tableau 2.

let array_1=[{"id":1,"name":"Peter"},{"id":2,"name":"John"},{"id":3,"name":"Andrew"},{"id":4,"name":"Patrick"},{"id":5,"name":"Brian"}, {"id":6,"name":"Joe"}]
let array_2=[{"id":1,"name":"not Peter"},{"id":80,"name":"not John"},{"id":3,"name":"not Andrew"},{"id":40,"name":"not Patrick"},{"id":5,"name":"not Brian"}]

const o = array_2.reduce((r, e) => (r[e.id] = true, r), {})
const result = array_1.map(e => ({ ...e, matches: o[e.id] || false}))
console.log(result)
3
Nenad Vracar 29 août 2020 à 10:24

Je rassemblerais d'abord les identifiants de array_2 dans un Set, les sets ont un temps de recherche O (1). Il est donc rapide de vérifier si un identifiant est dans cet ensemble. Ensuite, parcourez array_1 et vérifiez si l'id est présent dans l'ensemble créé en utilisant has().

let array_1 = [
    { id: 1, name: 'Peter'   },
    { id: 2, name: 'John'    },
    { id: 3, name: 'Andrew'  },
    { id: 4, name: 'Patrick' },
    { id: 5, name: 'Brian'   }
];

let array_2 = [
    { id:  1, name: 'not Peter'   },
    { id: 80, name: 'not John'    },
    { id:  3, name: 'not Andrew'  },
    { id: 40, name: 'not Patrick' },
    { id:  5, name: 'not Brian'   }
];

const array_2_ids = new Set(array_2.map(item_2 => item_2.id));
array_1.forEach(item_1 => item_1.matches = array_2_ids.has(item_1.id));

console.log('matched_array', array_1);

Votre code actuel ne fonctionne pas car la boucle for mettra à jour la propriété item_1.matches pour chaque élément de array_2. Cela signifie que vous écrasez la propriété à chaque fois. Cela entraînera à son tour que item_1 ne sera vérifié que par rapport au dernier élément de array_2.

Pour faire fonctionner votre code:

array_1.forEach(item_1 => {
    for (let i = 0; i < array_2.length; i++) {
        item_1.matches = array_2[i].id === item_1.id
    }
});

Devrait être changé en ceci:

array_1.forEach(item_1 => {
    for (let i = 0; i < array_2.length; i++) {
        if (array_2[i].id === item_1.id) {
            item_1.matches = true;
            return;
        }
    }
    item_1.matches = false;
});
1
3limin4t0r 29 août 2020 à 10:59