J'ai un tableau avec les adresses des étudiants et des parents.
Par exemple,
const users = [{
id: 1,
name: 'John',
email: '[email protected]',
age: 25,
parent_address: 'USA',
relationship:'mother'
},
{
id: 1,
name: 'John',
email: '[email protected]',
age: 25,
parent_address: 'Spain',
relationship:'father'
},
{
id: 2,
name: 'Mark',
email: '[email protected]',
age: 28,
parent_address: 'France',
relationship:'father'
}
];
J'essaye de reformater ceci au résultat suivant.
const list = [
{
id: 1,
name: 'John',
email: '[email protected]',
age: 25,
parent: [
{
parent_address: 'USA',
relationship:'mother'
},{
parent_address: 'Spain',
relationship:'father'
}
]
},
{
id: 2,
name: 'Mark',
email: '[email protected]',
age: 28,
parent:[
{
parent_address: 'France',
relationship:'father'
}
]
}
];
Jusqu'à présent, j'ai essayé la manière suivante. Je ne suis pas sûr que ce soit la bonne façon ou non.
const duplicateInfo = [];
for (var i = 0; i < user[0].length; i++) {
var parent = [];
if (duplicateInfo.indexOf(user[0][i].id) != -1) {
// Do duplicate stuff
} else {
// Do other
}
duplicateInfo.push(user[0][i].id);
}
javascript
arrays
kathy
la source
la source
parent_address
etrelationship
dans unparent
objet, et les fusionner lorsqu'un nom et une adresse e-mail en double sont trouvés.const list = []
au début, mais en bas vous parcourez cette liste apparemment en répétantuser[0]
. Votre exemple de code doit être cohérent.Réponses:
Une approche consisterait à utiliser
.reduce()
un objet comme accumulateur. Pour chaque identifiant, vous pouvez stocker un objet associé avec un tableau de parents auquel vous pouvez ajouter dans votre.reduce()
rappel chaque fois que vous rencontrez un nouvel objet avec le même identifiant. Ensuite, pour obtenir un tableau d'objets de votre objet, vous pouvez appelerObject.values()
sur elleVoir l'exemple ci-dessous:
Puisque vous avez mentionné que vous êtes nouveau dans JS, il peut être plus facile à comprendre de manière plus impérative (voir les commentaires de code pour plus de détails):
la source
reduce
rappel est agréable, mais peut-être un peu lourd pour un débutant.Vous pouvez réduire le tableau et rechercher un utilisateur avec le même identifiant et y ajouter les informations parent.
Si l'utilisateur n'est pas trouvé, ajoutez un nouvel utilisateur à l'ensemble de résultats.
la source
La restructuration de données comme celle-ci est assez courante et
Array.reduce()
est conçue pour la tâche. C'est une façon différente de voir les choses et il faut un certain temps pour s'y habituer, mais après avoir écrit le code plusieurs fois, cela devient une seconde nature.reduce()
est appelé sur un tableau et prend deux paramètres:Votre fonction est ensuite appelée pour chaque élément avec la valeur de départ pour la première exécution ou la valeur de retour de l'appel de fonction précédent pour chaque exécution suivante, le long de l'élément de tableau, indexez dans le tableau d'origine et le tableau d'origine qui réduit () a été appelé (les deux derniers sont généralement ignorés et rarement nécessaires). Il doit renvoyer l'objet ou tout ce que vous construisez avec l'élément actuel ajouté, et cette valeur de retour est transmise au prochain appel à votre fonction.
Pour des choses comme celle-ci, j'ai généralement un objet pour conserver les clés uniques (
id
pour vous), mais je vois que vous voulez qu'un tableau soit retourné. C'est une ligne pour mapper l'objet et les clés à un tableau et il est plus efficace d'utiliser le mécanisme de propriété d'objet intégré au lieu de array.find () pour voir si vous avez déjà ajouté un identifiant.la source
Vous devez répéter deux fois en utilisant la méthode actuelle. La complexité est O (n ^ 2). (pour Loop + indexOf)
Une meilleure façon est d'indexer le tableau et d'utiliser la clé du tableau pour la détection et la recherche de duplication.
Par exemple:
la source
la source
Vous pouvez utiliser la
Map
collection pour stocker des éléments uniques et simplement la remplir en utilisantfilter
:la source
la source