Найдите два значения в массиве, где заданное число находится между

#javascript #arrays

#javascript #массивы

Вопрос:

У меня есть массив с числами, но они могут быть уникальными, и числа будут меняться, но пока давайте предположим, что это так:

 const arr = [200, 180, 150, 120, 80];
 

И у меня есть среднее число из массива:

 const average = 146;
 

Мне нужна функция, которая проверяет, где это среднее число должно находиться между двумя числами из массива, в данном случае между 150 и 120, и только потом показывает что-то и т.д. Как я могу этого добиться?

Мой текущий прогресс, но это не дает нужного мне результата:

 let array = [200, 180, 150, 120, 80];

const sum = array.reduce(function(a, b){
    return a   b;
}, 0);

const average = sum / array.length; // 146

let check = (arr: any[], start: number, end: number, value: number) => (
    start <= end ?
    arr.filter((_, i) => i >= start amp;amp; i <= end) :
    arr.filter((_, i) => i >= start || i <= end)
).includes(value);

console.log('check', check(array, 120, 150, average)); // 120 and 150 must be found in function as these values can't be hardcoded and will change
 

Желаемый результат: если среднее число находится между этими двумя числами, то покажите этот текст и т.д. Как это можно сделать?

Комментарии:

1. Всегда ли массив предварительно сортируется одним и тем же способом? Всегда нисходящий или всегда восходящий?

2. Всегда нисходящий. @sbgib

Ответ №1:

Предположение

  • Массив отсортирован.

Условие

  • Проверьте, меньше ли оно текущего элемента в массиве и больше следующего элемента в массиве.

Примечание: если массив не отсортирован, вы можете сделать Array.sort()

 const arr = [200, 180, 150, 120, 80];

let sum = arr.reduce((acc, x) => {
  return acc   x
}, 0)

let avg = sum / arr.length;

for (let i = 0; i < arr.length - 1; i  ) {

  if (avg < arr[i] amp;amp; avg > arr[i   1]) {
    console.log("Here at indice "   (i   1)   " is "   avg   "'s place");
  }

} 

Ответ №2:

Используйте findIndex метод. (встроенные комментарии)

 const getIndexesBound = (arr, avg) => {
  const index = arr.findIndex((num) => avg > num);
  if (index < 1) {
    // when index 0 means first element
    // when index -1, can not find num
    return "Can not find indexes bound";
  } else {
    return [index - 1, index];
  }
};


const arr = [200, 180, 150, 120, 80];

console.log('Bound indexes for 146', getIndexesBound(arr, 146)); 

Ответ №3:

Попробуйте так:

 let array = [200, 180, 150, 120, 80];

const sum = array.reduce(function(a, b) {
  return a   b;
}, 0);

const average = sum / array.length; // 146


let check = (arr, start, end, value) => {
  let istart = array.indexOf(start);
  let iend = array.indexOf(end);
  let iaverage = 0;

  if (istart === -1 || iend === -1) {
    return null;
  };

  for (var i = istart; i <= iend; i  ) {
    if (arr[i] <= average) {
      return i;
    };
  };
  
  return null;
};

console.log('check', check(array, 150, 120, average)); // 120 and 150 must be found in function as these values can't be hardcoded and will change 

Самым простым способом было бы выполнить цикл между позициями start и end и проверить, где будет соответствовать среднее значение.

Ответ №4:

     let numArr = [200, 180, 150, 120, 80];
    
    const calcAvg = arr => arr.reduce((acc, cur) => acc  = cur, 0) / numArr.length;
    
    const isAvgPlace = (arr, start, end, avg) => {
        let sorted = [...arr].sort((a,b) => a - b);
        let avgPlace = sorted.filter((cur, i) => avg <= cur amp;amp; sorted[i 1] >= avg);
        return avgPlace[0] === start amp;amp; avgPlace[1] === end;
    }

    const average = calcAvg(numArr);
    console.log(isAvgPlace(numArr, 150, 180, average));
    console.log(isAvgPlace(numArr, 120, 150, average)); 

P.S: Пожалуйста, используйте значимые имена для именования переменных, функций и т. Д. Использование общих имен, таких как array и check , снижает читаемость и является плохой практикой.

Ответ №5:

 const array = [200, 180, 150, 120, 80];
    
    const check = (array,a,b)=>{
    
      //copy array
      const arrayClone = [...array];
      //sum copy array
      const sum = arrayClone.reduce(function(a, b){
          return a   b;
      }, 0);
      //average copy array
      const average = sum / arrayClone.length;
    
      //adding to an copy array
      arrayClone.push(average);
    
      //sort copy array
      arrayClone.sort(function(a, b) {
        return b-a;
      });
      // take the index of the push number
      const index = arrayClone.indexOf(average);
    
      // check that the average number is between the two numbers given
      if((arrayClone[index-1]===a)amp;amp;(arrayClone[index 1]===b)){
        // if ok
        console.log(arrayClone.slice(index-1,index 2))
      }else{
        console.log("not found")
      }
    
    }
    
    check(array,150,120);