В чем разница между этими 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 ответа:
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
.