Próbuję zaktualizować cenę BMW 730d w następnym JSON.

Obiekt samochodów powinien być nowym obiektem (niezmienność), więc muszę użyć funkcji mapy.

I nie chcę używać bibliotek takich jak niezmienna lub normalizr. Celem jest zdobycie mojej głowy wokół funkcji mapy, ale utknąłem ocenę marki.

const cars =
[
    {
        brand: 'BMW',
        model: [
            {
                name: '535d',
                price: 35000
            }, {
                name: '730d',
                price: 55000
            }
        ]
    },
    {
        brand: 'Mercedes',
        model: [
            {
                name: 'roadstar',
                price: 75000
            },
        ]
    },
];

Oto, co mam do tej pory:

// trying to update the price of a BMW 730d

const newCars= cars.map(brand => {
    console.log(brand);
    // and now ?

});

Ale teraz utknąłem.

Kto mnie pomaga?

Dzięki!

[Edytuj] Dodałem identyfikator "markę" w JSON, aby zidentyfikować modele.

0
Ole EH Dufour 3 czerwiec 2018, 19:49

3 odpowiedzi

Najlepsza odpowiedź

Sprawdziłbyś, czy bieżący obiekt dotyczy BMWS i zwrócić nowy obiekt (z żądaną nową listą modelu), lub po prostu zwróć niezmieniony obiekt inaczej:

const newCars = cars.map(car => {
    if (car.brand == "BMW") {
        return {
            brand: "BMW",
            model: car.model.map(model => {
                // …
            }),
        };
    } else {
        return car;
    }
});

Aby zaktualizować odpowiedni obiekt w tablicy model, użyj dokładnie tego samego podejścia ponownie.

1
Bergi 4 czerwiec 2018, 19:53

Jako techniczna techniczna frazowanie niezmienności jest nieprawidłowe. Niezmienne oznacza fundamentalną niezdolność do mutatu. W twoim przypadku wystarczy podjąć decyzję o zmutowaniu.

Niestety, w oparciu o strukturę swoich danych, musisz uzyskać trochę bałagan, aby wyodrębnić klucz. Object.keys jest najlepszym sposobem, o co myślę. Zwraca tablicę, więc musisz wprowadzić do indeksu 0.

cars.map(car => {
  const brand = Object.keys(car)[0];
  if (brand === 'BMW') {
  }
})
0
Andrew 3 czerwiec 2018, 16:59

Musisz przetestować w obiekcie obiektu, możesz użyć metody "Hasownproperty" obiektu, aby wiedzieć, czy obiekt X ma właściwość Y lub nie, w swoim przypadku musisz wykonać następujący test:

If(brand.hasOwnProperty('BMW')) {
  // To do 
}
-1
mth khaled 3 czerwiec 2018, 17:03