Mam tablicę z adresami uczniów i rodziców.
Na przykład,
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'
}
];
Próbuję sformatować to w następujący sposób.
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'
}
]
}
];
Do tej pory próbowałem w następujący sposób. Nie jestem pewien, czy to właściwa droga, czy nie.
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
źródło
źródło
parent_address
irelationship
w doparent
obiektu i połączyć je, gdy duplikat nazwa i adres e-mail znajdują.const list = []
na początku, ale na dole iterujesz tę listę, najwyraźniej przez iteracjęuser[0]
. Twój przykładowy kod powinien być spójny.Odpowiedzi:
Jednym podejściem byłoby użycie
.reduce()
obiektu jako akumulatora. Dla każdego identyfikatora możesz zapisać powiązany obiekt z tablicą nadrzędną, do której możesz dołączyć w.reduce()
wywołaniu zwrotnym za każdym razem, gdy napotkasz nowy obiekt o tym samym identyfikatorze. Następnie, aby uzyskać tablicę obiektów ze swojego obiektu, możesz wywołaćObject.values()
na nimZobacz przykład poniżej:
Ponieważ wspomniałeś, że jesteś nowy w JS, może być łatwiej zrozumieć w bardziej imperatywny sposób (szczegóły w komentarzach do kodu):
źródło
reduce
wywołaniu zwrotnym jest ładna, ale dla początkującego może być nieco ciężka.Możesz zmniejszyć tablicę i wyszukać użytkownika o tym samym identyfikatorze i dodać do niego informacje nadrzędne.
Jeśli użytkownik nie zostanie znaleziony, dodaj nowego użytkownika do zestawu wyników.
źródło
Restrukturyzacja takich danych jest dość powszechna i
Array.reduce()
jest przeznaczona do tego zadania. Jest to inny sposób przeglądania rzeczy i wymaga przyzwyczajenia się, ale po napisaniu kodu kilka razy staje się drugą naturą.reduce()
jest wywoływany w tablicy i przyjmuje dwa parametry:Twoja funkcja jest następnie wywoływana dla każdego elementu z wartością początkową dla pierwszego uruchomienia lub wartością zwracaną z poprzedniego wywołania funkcji dla każdego kolejnego uruchomienia, wzdłuż elementu tablicy, indeksu do oryginalnej tablicy i oryginalnej tablicy, która redukuje () został wywołany (dwa ostatnie są zwykle ignorowane i rzadko potrzebne). Powinien zwrócić obiekt lub cokolwiek, co budujesz z dodanym bieżącym elementem, a ta zwracana wartość zostanie przekazana do następnego wywołania twojej funkcji.
W przypadku takich rzeczy zwykle mam obiekt, aby zachować unikalne klucze (
id
dla ciebie), ale widzę, że chcesz zwrócić tablicę. To jedna linia do odwzorowania obiektu i kluczy na tablicę, a bardziej efektywne jest użycie wbudowanego mechanizmu właściwości obiektu zamiast array.find (), aby sprawdzić, czy już dodałeś identyfikator.źródło
Musisz powtórzyć dwa razy przy użyciu bieżącej metody. Złożoność wynosi O (n ^ 2). (dla Loop + indexOf)
Lepszym sposobem jest indeksowanie tablicy i użycie klucza tablicy do wykrywania i wyszukiwania duplikacji.
Na przykład:
źródło
źródło
Możesz użyć
Map
kolekcji do przechowywania unikalnych przedmiotów i po prostu wypełnić ją, używającfilter
:źródło
źródło