В чем разница между этими 2 способами создания списка массивов в JavaScript?


Как динамически создать список массивов в JavaScript, который фактически отображается в консоли разработчика в виде списка массивов?

Просто перефразировал этот вопрос; есть много примеров, как это сделать, и мой код работает, но я получаю 2 очень разных результата от этих 2 методов:

Я попробовал это:

var volume = [];
for (i = 0; i < json.length; i++) {
    var item = new Array(2);
    item[0] = json[i].json_date;
    item[1] = json[i].volume;
    volume.push(item);
    }

Итак, этот код работает, и, кажется, создает массив массивов,но в консоли разработчика результат консоли.log (typeof volume[0]) - это не определено.

Если я создаю массив вручную, он работает намного лучше:

var volume = [
    [1313964000000,23.17],
    [1314050400000,23.78],
    [1314741600000,25.24],
    [1314828000000,24.77],
    [1440021600000,82.69]
];

Теперь консоль.log (typeof volume[0]) - объект. И утешить.лог(объем) приводит к следующему: (5) [массив(2), массив(2), массив(2), массив(2), массив(2)]. Это то, что мне нужно, а не просто [].

Я провел весь день в поисках ответов и перепробовал множество вариантов этого кода, но, похоже, не могу найти код, который будет динамически создавать массив томов, чтобы правильно отображаться в виде массива массивы.

Кто - нибудь еще сталкивался с этим?

Вот полный код:

var volume = [];

fetch("http://localhost:3000/api/v1/TSLA").then(function(response) {
    if(response.ok) {
        response.json().then(function(json) {
            for (i = 0; i < Object.keys(json).length; i++){
                volume.push(new Array(json[i].json_date, json[i].volume));
                }

            });
        } else {
            console.log('Network request failed with response ' + 
response.status + ': ' + response.statusText);
        }
        });

        console.log(volume);

Итак, ответ от oknawe помог мне решить эту проблему; однако в некотором смысле вопрос до сих пор не был решен, потому что массив томов можно использовать только внутри этой функции выборки. Позже в коде данные все еще есть, но отдельные элементы тестируются как неопределенные...

3 3

3 ответа:

length объекта JSON будет undefined, так как объекты не имеют значения length. Вы можете использовать Object.keys, чтобы получить размер, но это не принесет вам много пользы, так как значения объектов не могут быть доступны по индексу:

var volume = [];
for (i = 0; i < Object.keys(json).length; i++) {
    // can't access using json[i] here
}

Однако вы можете использовать Object.keys(json) или Object.values(json) и сделать что-то вроде ниже: (Вам понадобится код внутри обратного вызова json)

let volume = [];
fetch('/api/foo/bar').then((data) => {
    return data.json();
}).then((json) => {
    console.log(json);
    Object.keys(json).forEach((obj) => {
        // obj = {"json_date": 1313964000000, "volume": 23.17, ...}
        console.log(obj);
        volume.push(new Array(obj["json_date"], obj["volume"]));
    });
    console.log(volume);
}).catch((e) => {
    console.error('There was a problem with the request');
})

Это должно работать нормально, предполагая, что переменная json структурирована так, как вы ожидаете. Вы также можете попробовать:

let volume = json.map((i) => [i.json_date, i.volume]);

(при условии, что среда позволяет использовать ES6.)

Вместо того, чтобы вручную перебирать массив, вы можете перебирать его содержимое с помощью функции map.

Благодаря окнау, у меня получилось. Использование этого кода работает, при условии, что я использую этот массив томов внутри кода выборки. Кроме того, массив томов по-прежнему содержит данные, но отдельные элементы не определены. Огромное спасибо всем, кто написал здесь!