#javascript #arrays
Вопрос:
У меня есть массив под названием tagline, который выглядит следующим образом:
[" Leger Poll", " Web survey of 2", "test", "test", "test", "test"]
он извлекается из внешнего CSS-файла. Я присвоил ему имя переменной tagline
.
Я хочу напечатать первый и второй элементы с помощью document.getElementById
, чтобы я мог стилизовать текст. Я не уверен, почему это не работает? Я попытался вывести переменную за пределы основной функции, чтобы она была глобальной, но все равно не работала. Я начинающий программист. Вот что у меня есть. Пожалуйста, помогите.
var tagline = [];
async function getData() {
// const response = await fetch('testdata.csv');
var response = await fetch('data/test3.csv');
var data = await response.text();
data = data.replace(/"/g, "");
var years = [];
var vals = [];
var rows = data.split('n').slice(1);
rows = rows.slice(0, rows.length - 1);
rows = rows.filter(row => row.length !== 0)
rows.forEach(row => {
var cols = row.split(",");
years.push(cols[0]);
vals.push(0 parseFloat(cols[1]));
tagline.push(cols[2]);
});
console.log(years, vals, tagline);
return { years, vals, tagline };
}
var res = tagline.slice(1);
document.getElementById("demo1").innerHTML = res;
var res2 = tagline.slice(2);
document.getElementById("demo2").innerHTML = res2;
</script> ```
Комментарии:
1. Можете ли вы показать нам результаты testdata.csv и ожидаемые значения для demo1 и demo2?
2. Ты никогда не звонишь
getData
? Но даже если бы вы это сделали: вы не можете ожидать, что будущий результат будет доступен сейчас.3. Вы никогда не вызываете функцию
getData()
. Даже если вы это сделали, это асинхронный запрос. Остальная часть вашего кода JS синхронна, поэтому он будет выполнен до завершения запроса, и массив будет содержать какие-либо данные. Вам следует рассмотреть возможность использования aPromise
.
Ответ №1:
Похоже, вы определили функцию getData()
, но не вызывали ее для выполнения.
Поскольку вы используете асинхронную функцию, я использую then()
.
var tagline = [];
async function getData() { ...// your function }
getData().then(() => {
const res = tagline[0];
document.getElementById("demo1").innerHTML = res;
const res2 = tagline[1];
document.getElementById("demo2").innerHTML = res2;
});
Комментарии:
1. tagline.slice возвращает массив!
2. Массив возвращает это в моем консольном Тринко [» Опрос Легера», «Веб-опрос 2», «тест», «тест», «тест», «тест»]
3. Я чувствую себя сбитым с толку. Извините, я всего лишь новичок. Я просто хочу отобразить на своей веб-странице первые два элемента массива (в col3), которые поступают из данных csv. У меня есть массив, поступающий правильно, но я не могу вывести его на печать на консоль.
4. Бигпигги. Вы хотите сказать, что я должен создать другую функцию внутри асинхронной функции для печати? Вот так? getData().затем(() => { const res = слоган[0]; document.getElementById(«demo1»).innerHTML = res; const res2 = слоган[1]; document.getElementById(«demo2»).innerHTML = res2; }
5. Это сработало. СПАСИБО ТЕБЕ, Бэдпигги!!! Ты-бомба!!! 💕
Ответ №2:
Для доступа к определенному индексу массива используйте:
array[index];
В вашем случае:
tagline[0]; //first element
tagline[1]; //second element
Так getData
как это async
вы должны await
для того, чтобы он заполнил tagline
:
await getData(); //call it before you use the tagline array
Если вы используете более старую версию JS, которая не поддерживает async/await
, вам нужно дождаться ответа с обещанием .then
.
Кроме того, имейте в виду:
Метод slice() возвращает неглубокую копию части массива в новый объект массива, выбранный от начала до конца (конец не включен), где начало и конец представляют индекс элементов в этом массиве.
Комментарии:
1. Пожалуйста, прочитайте весь вопрос полностью, прежде чем давать ответ.
2. @BadPiggie Какую часть я пропустил??!
3. Вы пропустили, что их массив пуст… И если бы это действительно был ответ, то, безусловно, это дублирующий вопрос, и вы должны проголосовать за закрытие. Посмотрите на комментарии под вопросом.
4. @BadPiggie Обновлено!
5. Нет. за исключением модулей ECMA, вы должны использовать
await
внутриasync
функции. Так что лучше, если вы обернете егоasync
функцией или используетеthen