#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);