Я пытался понять, как объединить несколько строк JSON в одну.
Мой метод таков:
if (observations[31]) { // Ignore this.
document.getElementById("ajaxrainmo").textContent = observations[31].imperial.precipTotal + observations[30].imperial.precipTotal + observations[29].imperial.precipTotal + observations[28].imperial.precipTotal + observations[27].imperial.precipTotal + observations[26].imperial.precipTotal + observations[25].imperial.precipTotal + observations[24].imperial.precipTotal + observations[23].imperial.precipTotal + observations[22].imperial.precipTotal + observations[21].imperial.precipTotal + observations[20].imperial.precipTotal + observations[19].imperial.precipTotal + observations[18].imperial.precipTotal + observations[17].imperial.precipTotal + observations[16].imperial.precipTotal + observations[15].imperial.precipTotal + observations[14].imperial.precipTotal + observations[13].imperial.precipTotal + observations[12].imperial.precipTotal + observations[13].imperial.precipTotal + observations[11].imperial.precipTotal + observations[10].imperial.precipTotal + observations[9].imperial.precipTotal + observations[8].imperial.precipTotal + observations[7].imperial.precipTotal + observations[6].imperial.precipTotal + observations[5].imperial.precipTotal + observations[4].imperial.precipTotal + observations[3].imperial.precipTotal + observations[2].imperial.precipTotal + observations[1].imperial.precipTotal + observations[0].imperial.precipTotal + " in"
} // Adding up a bunch of rain totals to one number.
Это работает... но это очень запутанно и беспорядочно... если есть более быстрый вариант, я мог бы его использовать. Спасибо.
document.getElementById("ajaxrainmo").textContent = observations.reduce((a,c) => a+c.imperial.precipTotal, 0) + " in";
Это требует цикла! Вы много повторяете код, и это плохо. Вы можете попробовать это:
let total = 0
for (const obs of observations) {
total += obs.imperial.precipTotal
}
document.getElementById("ajaxrainmo").textContent = total
В данном примере элементы расположены в обратном порядке.
если доступен более быстрый вариант
Я не думаю, что можно достичь цели быстрее, но можно написать читаемый и поддерживаемый код.
Я пытался понять, как объединить несколько строк JSON в одну.
Предполагая, что в массиве больше элементов, и вам нужны первые 32:
const observations = [{imperial:{precipTotal:'a1'}},{imperial:{precipTotal:'b1'}},{imperial:{precipTotal:'c1'}},{imperial:{precipTotal:'d1'}},{imperial:{precipTotal:'e1'}},{imperial:{precipTotal:'a2'}},{imperial:{precipTotal:'b2'}},{imperial:{precipTotal:'c2'}},{imperial:{precipTotal:'d2'}},{imperial:{precipTotal:'e2'}},{imperial:{precipTotal:'a3'}},{imperial:{precipTotal:'b3'}},{imperial:{precipTotal:'c3'}},{imperial:{precipTotal:'d3'}},{imperial:{precipTotal:'e3'}},{imperial:{precipTotal:'a4'}},{imperial:{precipTotal:'b4'}},{imperial:{precipTotal:'c4'}},{imperial:{precipTotal:'d4'}},{imperial:{precipTotal:'e4'}},{imperial:{precipTotal:'a5'}},{imperial:{precipTotal:'b5'}},{imperial:{precipTotal:'c5'}},{imperial:{precipTotal:'d5'}},{imperial:{precipTotal:'e5'}},{imperial:{precipTotal:'a6'}},{imperial:{precipTotal:'b6'}},{imperial:{precipTotal:'c6'}},{imperial:{precipTotal:'d6'}},{imperial:{precipTotal:'e6'}},{imperial:{precipTotal:'a7'}},{imperial:{precipTotal:'b7'}},{imperial:{precipTotal:'c7'}},{imperial:{precipTotal:'d7'}},{imperial:{precipTotal:'e7'}},{imperial:{precipTotal:'a8'}},{imperial:{precipTotal:'b8'}},{imperial:{precipTotal:'c8'}},{imperial:{precipTotal:'d8'}},{imperial:{precipTotal:'e8'}}];
const result = observations.slice(0, 32).map(o => o.imperial.precipTotal).reverse().join('') + ' in';
console.info(result);
slice(0, 32)
: берем первые 32 элемента (это не нужно, если вы берете все элементы массива)
map(o => o.imperial.precipTotal)
: сопоставьте каждый элемент массива со строкой precipTotal
.
reverse()
: перевернуть струны
join('')
: объединить строки в одну строку без разделителя
Предположим, я неправильно понял ваш вопрос и precipTotal
содержит числа, которые вы хотите суммировать, я бы пошел аналогичным путем.
const observations = [{imperial:{precipTotal:11}},{imperial:{precipTotal:21}},{imperial:{precipTotal:31}},{imperial:{precipTotal:41}},{imperial:{precipTotal:51}},{imperial:{precipTotal:12}},{imperial:{precipTotal:22}},{imperial:{precipTotal:32}},{imperial:{precipTotal:42}},{imperial:{precipTotal:52}},{imperial:{precipTotal:13}},{imperial:{precipTotal:23}},{imperial:{precipTotal:33}},{imperial:{precipTotal:43}},{imperial:{precipTotal:53}},{imperial:{precipTotal:14}},{imperial:{precipTotal:24}},{imperial:{precipTotal:34}},{imperial:{precipTotal:44}},{imperial:{precipTotal:54}},{imperial:{precipTotal:15}},{imperial:{precipTotal:25}},{imperial:{precipTotal:35}},{imperial:{precipTotal:45}},{imperial:{precipTotal:55}},{imperial:{precipTotal:16}},{imperial:{precipTotal:26}},{imperial:{precipTotal:36}},{imperial:{precipTotal:46}},{imperial:{precipTotal:56}},{imperial:{precipTotal:17}},{imperial:{precipTotal:27}},{imperial:{precipTotal:37}},{imperial:{precipTotal:47}},{imperial:{precipTotal:57}},{imperial:{precipTotal:18}},{imperial:{precipTotal:28}},{imperial:{precipTotal:38}},{imperial:{precipTotal:48}},{imperial:{precipTotal:58}}];
const result = observations.slice(0, 32).map(o => o.imperial.precipTotal).reduce((acc, el) => acc + el) + ' in';
console.info(result);
slice(0, 32)
: берем первые 32 элемента (это не нужно, если вы берете все элементы массива)
map(o => o.imperial.precipTotal)
: сопоставьте каждый элемент массива со строкой precipTotal
.
reduce((acc, el) => acc + el)
: просуммировать значения
Действительно помогло, спасибо!
Почему бы не зациклиться
observations
? Developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…