• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Tworzenie tablicy z wybranych obiektów

Object Storage Arubacloud
0 głosów
1,166 wizyt
pytanie zadane 30 lipca 2019 w JavaScript przez niezalogowany
zamknięte 30 lipca 2019 przez Comandeer

Witam jak stworzyć tablice składającą się z wybranych obiektów pobranych z pliku JSON. poniżej daje plik z danymi

{
    "teams": [
        {
            "team": "Arsenal",
            "players": [
                {
                    "name": "Mesut Ozil"
                },
                {
                    "name": "Nacho Monreal"
                }
            ]
        },
        {
            "team": "Aston Villa",
            "players": [
                {
                    "name": "Jack Grealish"
                },
                {
                    "name": "Ahmed Elmohamady"
                }
            ]
        },
        {
            "team": "Bournemouth",
            "players": [
                {
                    "name": "Artur Boruc"
                },
                {
                    "name": "Jordon Ibe"
                }
            ]
        }

    ]
}

Chciałbym z tego pliku "wyjąć" wszystkie obiekty co mają name i umieścić je jeden po drugim w tablicy. Pytanie czy można dostać się do całego obiektu i go skopiować czy można tylko dostać się do konkretnej wartości czyt. "name". Nie wiem czy nie najlepszą opcją byłoby użycie metody Array.from która jak mówi definicja: 

"Array.from() lets you create Arrays from:

array-like objects (objects with a length property and indexed elements) or
iterable objects (objects where you can get its elements, such as Map and Set)."

w tym przypadku plik dane z JSON'a są "Array-like" ?

1 odpowiedź

+1 głos
odpowiedź 30 lipca 2019 przez ScriptyChris Mędrzec (190,190 p.)

Przyjmuję, że cały obiekt, który umieściłeś przypisany będzie do zmiennej o nazwie json.

Można to zrobić na kilka sposobów, m.in.:

  • zwykłe pętle for
const playerNames = [];

for (let i = 0; i < json.teams.length; i++) {
	const team = json.teams[i];

	for (let j = 0; j < team.players.length; j++) {
        playerNames.push(team.players[j].name);
    }
}
const names = [];

json.teams.forEach(team => {
    team.players.forEach(player => names.push(player.name))
});
const playerNames = json.teams.map(team => {
	const players = team.players.map(player => player.name);
	return players;
}).flat();
const playerNames = json.teams.flatMap(team => {
	const players = team.players.map(player => player.name);
	return players;
});
const playerNames = json.teams.reduce((names, team) => {
	const players = team.players.map(player => player.name); 
	names.push(...players); 
	return names;
}, []);

Użycie Array.from miało by sens, gdybyś tym obiektom nadał property length o nieujemnej liczbie całkowitej.

komentarz 30 lipca 2019 przez niezalogowany
edycja 30 lipca 2019

ustawiłem length na 5 i utworzyłem tablice z pięcioma pustymi obiektami. 

const playerArray = Array.from({length: 5},()=>({}));

Teraz chciałbym wypełnić te obiekty wartościami z obiektów z tablicy "players" z pliku JSON.
Używam webpacka i poprostu importuje JSON'a z zewnętrznego pliku a potem odnosze się do niego w JS'ie.

import data from '../data';

Aha zapomniałem dodać że obiekty z tablicy players będą rozbudowywane o kolejne właściwości jak np. ścieżka do obrazka dla danego zawodnika, wiek itp. Do tych wartości będe potem odnosił się w reactowych komponentach. Teraz akurat chce stworzyć komponent, który będzie wyświetlał pięć losowych obiektów zawierających obrazek oraz imię.

 

komentarz 30 lipca 2019 przez ScriptyChris Mędrzec (190,190 p.)

W JavaScript długość tablicy ma wartość dynamiczną. Jaki sens jest tworzyć tablicę o określonej początkowej długości, zawierającą puste obiekty, po to żeby ją potem wypełnić? Ba, ta początkowa długość 5 i tak może ulec zmianie w trakcie późniejszych operacji na tablicy. To wygląda podobnie do takiego zapisu:

const playerNames = new Array(5).fill({});

 

komentarz 30 lipca 2019 przez niezalogowany
Nie chcę tworzyć pustej tablicy, chcę ją wypełnić tylko nie wiem jak. Narazie ustawiłem tylko length, ale nie wiem co dalej :(. Nie wiem jak wypełnić te obiekty właściwościami oraz przypisanymi do nich wartościami z pliku JSON.
komentarz 30 lipca 2019 przez ScriptyChris Mędrzec (190,190 p.)
Przecież podałem Ci kilka przykładów jak utworzyć tablicę, która będzie zawierać nazwy wszystkich piłkarzy z drużyn. Jeśli struktura wyjściowa Ci nie odpowiada, to pokaż jakiej oczekujesz.
komentarz 30 lipca 2019 przez niezalogowany
Chciałbym wypełnić tablice obiektami z których każdy zawiera dwie właściwości. Nie tylko "name", ale jeszcze jedną.
komentarz 30 lipca 2019 przez ScriptyChris Mędrzec (190,190 p.)
W trakcie mapowania możesz dodać wiele właściwości. Pokaż proszę jak ma wyglądać wyjściowa struktura danych, bo chyba nie rozumiem o co Ci konkretnie chodzi.
komentarz 30 lipca 2019 przez niezalogowany
const playerArray = [
    {
        name: "zawodnik",
        image: "ścieżka do obrazka"
    },
    {
        name: "zawodnik",
        image: "ścieżka do obrazka"
    },
    {
        name: "zawodnik",
        image: "ścieżka do obrazka"
    },
    {
        name: "zawodnik",
        image: "ścieżka do obrazka"
    },
    {
        name: "zawodnik",
        image: "ścieżka do obrazka"
    },
]

właściwości które znajdują się w tych obiektach mają być pobierane z pliku JSON.

komentarz 30 lipca 2019 przez ScriptyChris Mędrzec (190,190 p.)

To wygląda jak łączenie 2 osobnych struktur danych. Będziesz musiał identyfikować, do którego obiektu zawodnika dodać którą wartość property image. Jak wygląda struktura danych zawierająca pola image?

komentarz 30 lipca 2019 przez niezalogowany

JSON:

"teams": [
        {
            "team": "Arsenal",
            "players": [
                {
                    "name": "Mesut Ozil",
                    "image": "./src/assets/image/image.jpg"
                },
            ]
        }
]

 

komentarz 30 lipca 2019 przez ScriptyChris Mędrzec (190,190 p.)

Przecież to praktycznie ta sama struktura danych, którą podałeś w pytaniu. Biorąc więc przykład z pętlą for z mojej odpowiedzi i rozszerzając dodanie pola image:

const playerNames = [];
 
for (let i = 0; i < json.teams.length; i++) {
    const team = json.teams[i];
 
    for (let j = 0; j < team.players.length; j++) {
        playerNames.push({
            name: team.players[j].name,
            image: team.players[j].image
        });
    }
}

 

komentarz 30 lipca 2019 przez niezalogowany
Dużo pomogłeś, dzięki za pomoc :)

Podobne pytania

0 głosów
1 odpowiedź 297 wizyt
pytanie zadane 14 marca 2022 w PHP przez AnimaVillis Stary wyjadacz (11,510 p.)
0 głosów
0 odpowiedzi 147 wizyt
0 głosów
0 odpowiedzi 425 wizyt

92,615 zapytań

141,465 odpowiedzi

319,782 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...