Как перебрать вложенный объект и вернуть значения в массиве? - PullRequest
0 голосов
/ 23 марта 2020

В настоящее время я пытаюсь получить точки данных из ответа API для использования в графике. Я заинтересован в возвращении массива значений "4. close" следующего объекта.


let res = {
    "Meta Data": {
        "1. Information": "Daily Prices (open, high, low, close) and Volumes",
        "2. Symbol": "amzn",
        "3. Last Refreshed": "2020-03-20",
        "4. Output Size": "Compact",
        "5. Time Zone": "US/Eastern"
    },
    "Time Series (Daily)": {
        "2020-03-20": {
            "1. open": "1926.3100",
            "2. high": "1957.0000",
            "3. low": "1820.7300",
            "4. close": "1846.0900",
            "5. volume": "9740990"
        },
        "2020-03-19": {
            "1. open": "1860.0000",
            "2. high": "1945.0000",
            "3. low": "1832.6500",
            "4. close": "1880.9300",
            "5. volume": "10399943"
        },
        "2020-03-18": {
            "1. open": "1750.0000",
            "2. high": "1841.6600",
            "3. low": "1745.0000",
            "4. close": "1830.0000",
            "5. volume": "9596297"
        }
    }
}

// I need this returned => [1846, 1880, 1830]

В настоящее время мой код выглядит следующим образом:

const parsed = res["Time Series (Daily)"]

const datesArr = Object.entries(parsed).map((e) => ( { [e[0]]: e[1] } ))


function getYCoords() {
  for(i=0;i<datesArr.length;i++) {
  let dateObj = datesArr[i]
  console.log(dateObj["4. close"])
  }
}


Я использовал map, чтобы превратить вложенный объект в массив объектов, надеясь, что это поможет мне правильно перебирать данные, но я думаю, что я сделал вещи более трудными и становлюсь неопределенным в этот момент. Может кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 23 марта 2020

Ваша проблема в том, что Object.entries(parsed) дает вам массив, который выглядит следующим образом:

[ "2020-03-20", { "1. open": "1926.3100", "2. high": "1957.0000", "3. low": "1820.7300", "4. close": "1846.0900", "5. volume": "9740990" } ], [ "2020-03-19", { "1. open": "1860.0000", "2. high": "1945.0000", "3. low": "1832.6500", "4. close": "1880.9300", "5. volume": "10399943" } ], [ "2020-03-18", { "1. open": "1750.0000", "2. high": "1841.6600", "3. low": "1745.0000", "4. close": "1830.0000", "5. volume": "9596297" } ] ]

... поэтому, когда вы отображаете e[0] как ключ нового объект, вы устанавливаете дату в качестве ключа, а не "4. close" et c. свойства от ваших объектов. Простым решением будет сопоставление записей с объектом, хранящимся в e[1], который содержит все пронумерованные свойства:

const res = { "Meta Data": { "1. Information": "Daily Prices (open, high, low, close) and Volumes", "2. Symbol": "amzn", "3. Last Refreshed": "2020-03-20", "4. Output Size": "Compact", "5. Time Zone": "US/Eastern" }, "Time Series (Daily)": { "2020-03-20": { "1. open": "1926.3100", "2. high": "1957.0000", "3. low": "1820.7300", "4. close": "1846.0900", "5. volume": "9740990" }, "2020-03-19": { "1. open": "1860.0000", "2. high": "1945.0000", "3. low": "1832.6500", "4. close": "1880.9300", "5. volume": "10399943" }, "2020-03-18": { "1. open": "1750.0000", "2. high": "1841.6600", "3. low": "1745.0000", "4. close": "1830.0000", "5. volume": "9596297" } } }
const parsed = res["Time Series (Daily)"];


function getYCoords() {
  for (i = 0; i < datesArr.length; i++) {
    let dateObj = datesArr[i]
    console.log(dateObj["4. close"])
  }
}

const datesArr = Object.entries(parsed).map((e) => e[1]);
getYCoords();

Однако, поскольку вас интересуют только значения, нет необходимости получать записи (которые содержат как ключи, так и значения). Вместо этого вы можете получить Object.values() (то есть массив ваших объектов) и затем сопоставить их со значениями, хранящимися в "4. close":

const res = { "Meta Data": { "1. Information": "Daily Prices (open, high, low, close) and Volumes", "2. Symbol": "amzn", "3. Last Refreshed": "2020-03-20", "4. Output Size": "Compact", "5. Time Zone": "US/Eastern" }, "Time Series (Daily)": { "2020-03-20": { "1. open": "1926.3100", "2. high": "1957.0000", "3. low": "1820.7300", "4. close": "1846.0900", "5. volume": "9740990" }, "2020-03-19": { "1. open": "1860.0000", "2. high": "1945.0000", "3. low": "1832.6500", "4. close": "1880.9300", "5. volume": "10399943" }, "2020-03-18": { "1. open": "1750.0000", "2. high": "1841.6600", "3. low": "1745.0000", "4. close": "1830.0000", "5. volume": "9596297" } } }
const parsed = res["Time Series (Daily)"];
const datesArr = Object.values(parsed).map((e) => +e["4. close"]); // + to turn string into number
console.log(datesArr);
...