Среднее значение между каждым элементом массива

Мне нужна помощь с моим приложением 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, но они не связаны.


61
5

Ответы:

Приведенные ниже функции вычисляют средние значения в соответствии с тем, что вы описали, и возвращают их в виде 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 ]