Мне нужна помощь с моим приложением React Native. Мне нужно рассчитать среднее значение между каждым элементом массива. Логика следующая, если есть 4 элемента со значениями 3,5,6,9, то нужно вычислить среднее значение между 3 и 5 и разделить на 1, между 3, 5, 6 и разделить на 2 и т.д. Первое значение считается начальным значением, поэтому оно не учитывается.
Буду признателен за любую помощь.
return (
<View style = {Styles.sectionContainer}>
{readings.map(
({
id,
date,
volume,
}) => {
return (
<View key = {id} style = {Styles.card}>
<Text
style = {[
Styles.sectionHeading,
Styles.darkAppText,
{ fontWeight: "bold" },
]}
>
average: {average}
</Text>
</View>
);
}
)}
</View>
);
}
Я пытался сделать это внутри функции карты, но она дает среднее значение между двумя последними элементами:
if (id == 1) {
average = 0;
} else if (id > 1) {
for (i = 1; i < readings.length; i++) {
average = (readings[i].volume readings[i - 1].volume) / i;
}
}
🤔 А знаете ли вы, что...
Синтаксис JavaScript схож с синтаксисом языка программирования Java, но они не связаны.
Приведенные ниже функции вычисляют средние значения в соответствии с тем, что вы описали, и возвращают их в виде Array
:
const data = [3,5,6,9];
function avg(first, ...rest) {
const v = rest.reduce((a, b) => a + b, first);
return v / rest.length;
}
function getAvgAll(values) {
const results = [];
for (let i = 1; i < values.length; i += 1) {
results.push(avg(...values.slice(0, i + 1)));
}
return results;
}
console.info(getAvgAll(data));
Обновлено: ваша проблема не имеет ничего общего с React Native, а просто с работой JS. Вот код
function calculateAverageValues(arr) {
if (arr.length < 2) {
return []; // If there are less than 2 items,return empty
}
const outputArray = [];
let sum = arr[0]; // Initialize the sum with the first item
for (let i = 1; i < arr.length; i++) {
sum += arr[i]; // Add the current element to the sum.
const average = sum / i; // Calculate the average value.
outputArray.push(average); // Push the average value to output
}
return outputArray;
}
Пример использования:
const inputArray = [3, 5, 6, 9];
const result = calculateAverageValues(inputArray);
console.info(result); // Output:[ 8, 7, 7.666666666666667 ]
Предполагая, что вы хотите рассчитать средние значения вашего массива по такому шаблону:
псевдокод:
[
average(array[0]...array[1]),
average(array[0]...array[2]),
average(array[0]...array[3]),
...
average(array[0]...array[array.length - 1])
]
Вы можете сделать что-то вроде этого:
const values = [3, 5, 6, 9];
const averages = values.flatMap((el, i, array) => {
const length = i + 2;
if (length > array.length) return [];
const part = array.slice(0, length);
return part.reduce((a, b) => a + b) / part.length;
});
console.info(averages);
Хоть вы и пишете, что первое значение не учитывать, но вы вроде бы все равно хотите что-то за него вывести. Возможно, в этом заключается роль утверждения if (id == 0)
, хотя нет (объясненной) причины, по которой запись с id
0 должна быть первой. Тем не менее, вы, кажется, хотите сопоставить эту первую запись с 0.
Вы можете использовать эту функцию для этого:
function runningVolumeAverage(arr) {
let sum = 0;
return arr.map(({volume}, i) => {
sum += volume;
return i && sum / i;
});
}
const readings = [{ volume: 3 }, { volume: 5 }, { volume: 6 }, { volume: 9 }];
console.info(runningVolumeAverage(readings));
Если вы хотите исключить этот ноль и хотите, чтобы в вашем выводе было на одно значение меньше, чем во входном, примените .slice(1)
к возвращаемому массиву:
console.info(runningVolumeAverage(readings).slice(1));
В ваш фактический код вы можете интегрировать его следующим образом (при условии, что весь остальной код в порядке, и только average
была недостающей частью информации):
const averages = runningVolumeAverage(readings);
return (
<View style = {Styles.sectionContainer}>
{readings.map(
({
id,
date,
volume,
}, i) => { // <-- get the index
return (
<View key = {id} style = {Styles.card}>
<Text
style = {[
Styles.sectionHeading,
Styles.darkAppText,
{ fontWeight: "bold" },
]}
>
average: {averages[i]} // <-- get the average
</Text>
</View>
);
}
)}
</View>
);
Для первого элемента и последнего элемента в массиве я выбираю возвращать значение 0, которое вы можете изменить на любое значение, которое хотите.
const array = [3,5,6,9]
const arrayValuePerIndex = array.map((item, index, origArray) => {
return index === 0 ? 0 : index< origArray.length - 1? (item + origArray[index + 1]) / (index + 1) : 0;
});
console.info(arrayValuePerIndex) // [ 0, 5.5, 5, 0 ]