Найти ближайший к числу внутри массива - PullRequest
0 голосов
/ 03 декабря 2018

У меня ниже массива

const floorPerDayMilestones = [25, 50, 75, 100, 125, 150, 175, 200]

. Пользователь frontEnd вводит любое число, скажем, что это

const number = 136

Мне нужно найти ближайшее к числу число, но меньшее.Таким образом, вывод должен быть 125

Даже если число равно 149, вывод должен быть 125

Как я могу это сделать.Я пробовал много способов, но мог получить ответ.

Спасибо !!!

Ответы [ 7 ]

0 голосов
/ 03 декабря 2018

Вы также можете отфильтровать числа, превышающие заданные, и выбрать максимум из этого подмножества.

const floorPerDayMilestones = [25, 50, 75, 100, 125, 150, 175, 200]

const number = 136

const filtered = floorPerDayMilestones.filter(el=>el<=number);

console.log(Math.max(...filtered))

Или, если вы уже используете lodash (только в этом случае - не импортируйте lodash только для использования решения ниже), вы можете сделать это с помощью maxBy,maxBy обрабатывает числа больше number как null.

const floorPerDayMilestones = [25, 50, 75, 100, 125, 150, 175, 200]

const number = 136

let result = _.maxBy(floorPerDayMilestones, el=>el<=number?el:null);

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 03 декабря 2018

С lodash вы можете использовать _.sortedIndex:

const numbers = [25, 50, 75, 100, 125, 150, 175, 200]

const closestNum = (arr, n) => {
  let index = _.sortedIndex(arr, n)
  return arr[index] == n ? arr[index] : arr[index-1]
}

console.log(closestNum(numbers, 135))  // 120
console.log(closestNum(numbers, 160))  // 150
console.log(closestNum(numbers, 180))  // 175
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

С JS вы можете просто использовать Array.reduceRight:

const numbers = [25, 50, 75, 100, 125, 150, 175, 200]

const closestNum = (arr, n) => arr.reduceRight((r,c) => !r && c < n ? c : r, 0)

console.log(closestNum(numbers, 135))  // 120
console.log(closestNum(numbers, 160))  // 150
console.log(closestNum(numbers, 180))  // 175

Поскольку все начинается с правой стороны, все, что вас волнует, - это найти первое число меньше вашего аргумента n.

Вы также можетесделайте Array.reverse, а затем просто Array.filter (используйте Array.from, если вы не хотите mutate массив):

const numbers = [25, 50, 75, 100, 125, 150, 175, 200]

const closestNum = (arr, n) => arr.reverse().find(x => x < n)

// To not mutate use `Array.from`
// const closestNum = (arr, n) => Array.from(arr).reverse().find(x => x < n)

console.log(closestNum(numbers, 135))  // 120
console.log(closestNum(numbers, 160))  // 150
console.log(closestNum(numbers, 180))  // 175
0 голосов
/ 03 декабря 2018

Вы можете отсортировать массив в порядке возрастания, а затем найти индекс числа, который непосредственно выше number, тогда на одну позицию меньше этого значения будет непосредственное число, которое меньше number

const floorPerDayMilestones = [25, 50, 75, 100, 125, 150, 175, 200]
const number = 136;
floorPerDayMilestones.sort((a,b)=> a-b);
var index = floorPerDayMilestones.findIndex(val => val>number);
var num = floorPerDayMilestones[index-1];
console.log(num);
0 голосов
/ 03 декабря 2018

Попробуйте это

const floorPerDayMilestones = [25, 50, 75, 100, 125, 150, 175, 200];
    
const number = 136;
    
    
const nextLesser = floorPerDayMilestones.reduce((nl, curr) => (curr <= number) && (curr > nl) ? curr : nl , 0)

console.log(nextLesser)

Используется Array.prototype.reduce

0 голосов
/ 03 декабря 2018

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

И в вашем foreach сохранить ближайший номер в переменной.Затем проверьте, больше ли ваш номер, чем номер в вашем массиве.если да, возьми свой последний вар, иначе продолжай свой foreach

0 голосов
/ 03 декабря 2018

Вы можете использовать Array.reduce для этого

const floorPerDayMilestones = [25, 50, 75, 100, 125, 150, 175, 200]

function getClosestNumber(d) {
  return floorPerDayMilestones.reduce((a, b) => b <=d && a < b ? b : a, 0 )
}

console.log(getClosestNumber(135) || 'No lesser number available')

console.log(getClosestNumber(149) || 'No lesser number available')

console.log(getClosestNumber(22) || 'No lesser number available')
0 голосов
/ 03 декабря 2018

Если отсортировано в порядке возрастания, как в вопросе, это должно работать.

const floorPerDayMilestones = [25, 50, 75, 100, 125, 150, 175, 200];
const number = 136;

function findClosest(arr, num) {
  for (let i = 0; i < arr.length; ++i) {
    if (arr[i] > num) {
      return arr[i - 1];
    }
  }
}

console.log(findClosest(floorPerDayMilestones,number));
...