Mam obiekt json i chcę pobrać z niego niektóre wartości, aby utworzyć nowy obiekt w React.js. Jednak bez względu na to, co próbuję, pojawiają się błędy związane z niezdefiniowaniem wartości lub klucza.

Json

{
    "meat":{"drink":"Bovril", "courses":{ "main":"chicken", "pudding":"jelly" },
    "vegetarian":{"drink":"milkshake", "courses":{"main":"cheese","pudding":"ice cream"},
    "vegan":{"drink":"spinach juice", "courses":{"main":"lettuce","pudding":"apple"}
}

Oczekiwane wyniki

Chciałbym dynamicznie utworzyć obiekt o nazwie defaultValues , który pasuje do poniższego, gdybym miał go na stałe zakodować. Jak widać, jest to tworzone z wartości w powyższym pliku json:

const defaultValues: {
    meat: "chicken",
    vegetarian: "cheese",
    vegan: "lettuce"
  }

Wypróbowałem następujące w oparciu o odpowiedź na podobne pytanie, ale to nie działa:

Moja próba

const json = Json; //this contains the contents of my json file above

const defaultValues = {};
Object.keys(json).forEach(function(key) {
  defaultValues[key.meat].push([key.courses.main]);
});

Błąd

Wciąż otrzymuję następujący błąd:

×TypeError: Cannot read property 'push' of undefined

Czy ktoś może doradzić, jak to zrobić?

Wielkie dzięki,

Katie

0
Katie7 1 kwiecień 2020, 18:54

3 odpowiedzi

Najlepsza odpowiedź

Przede wszystkim poprawiłem twój json. Następnie wykonuję iterację kluczy obiektu json, aby utworzyć obiekt defaultValues. Podejmując próbę, traktujesz obiekt jako tablicę. Tylko tablice mają metodę wypychania.

const json = {
    "meat": {
        "drink":"Bovril", 
        "courses":{ 
            "main":"chicken", 
            "pudding":"jelly" 
        }
    },
    "vegetarian":{
        "drink":"milkshake", 
        "courses":{
            "main":"cheese",
            "pudding":"ice cream"
        }
    },
    "vegan":{
        "drink":"spinach juice", 
        "courses":{
            "main":"lettuce",
            "pudding":"apple"
        }
    }
};

const defaultValues = {};

Object.keys(json).forEach(e => {
  defaultValues[e] = json[e]["courses"].main;
});

console.log(defaultValues);
1
Manuel Eguiluz 1 kwiecień 2020, 16:29

Nie jestem do końca pewien, czy poprawnie przeczytałem Twoje pytanie, ale jeśli próbujesz wygenerować

const defaultValues: {
    meat: "chicken",
    vegetarian: "cheese",
    vegan: "lettuce"
}

Z tego obiektu json - (włożyłem to do walidatora i nie wyszło pomyślnie, oto poprawiony format)

const Json= {
    "meat": {"drink": "Bovril","courses": {"main": "chicken","pudding": "jelly"}},
    "vegetarian": {"drink": "milkshake","courses": {"main": "cheese","pudding": "ice cream"}},
    "vegan": {"drink": "spinach juice","courses": {"main": "lettuce","pudding": "apple"}}
}

Wtedy poniższe powinno działać

const json = Json; //this contains the contents of my json file above

const defaultValues = {};
Object.keys(json).forEach(function(key) {
  defaultValues[key] = json[key].courses.main;
});
1
bryanstevens314 1 kwiecień 2020, 16:24

Powodem, dla którego otrzymujesz błąd, jest to, że używasz metody tablicowej na obiekcie. Twoje defaultValues to obiekt {}

Inną kwestią jest to, że json jest ciągiem znaków i najpierw trzeba byłoby go przeanalizować do obiektu. W niektórych plikach json brakuje też końcowych nawiasów klamrowych.

Oto moje podejście do Twojego kodu:

const json = `{
  "meat": {
      "drink": "Bovril", "courses": { "main": "chicken", "pudding": "jelly" }},
  "vegetarian": {
      "drink": "milkshake", "courses": { "main": "cheese", "pudding": "ice cream" }},  
  "vegan": {
      "drink": "spinach juice", "courses": { "main": "lettuce", "pudding": "apple" }}
}`;

const menu = JSON.parse(json)

const defaultValues = {};
Object.entries(menu).forEach(function (entry) {
  defaultValues[entry[0]] = entry[1].courses.main;
});
console.log(defaultValues) // -> Object {meat: "chicken", vegetarian: "cheese", vegan: "lettuce"}

Object.entries zwraca tablicę z długością kluczy obiektu oraz tablicę kluczy i wartości. Jest to więc kwestia odwzorowania tych wartości na defaultValues przy użyciu wpisu [0] jako klucza i wpisu [1] jako wartości.

Edycja: dodawanie działającego przykładu na odesandbox

1
fabrice 1 kwiecień 2020, 16:20