фильтрующий массив в диапазоне массива времени и времени теперь JavaScript - PullRequest
0 голосов
/ 24 октября 2018

У меня возникают проблемы, когда я пытаюсь отфильтровать время сейчас во времени массива, у меня есть такой код;

  var timeNow = "07";
    var timeShift = ["08","10","12","14","16","18","20","22","00","02","04","06"];
    var newData =[];
    for(var data of timeShift){
    	 if(data >= timeNow){
     	  	newData.push(data);
        }
    }
    console.log(newData[0]); // output 08

проблема не совпадает с моими ожиданиями.Мне нужно :если timeNow равно 08, timeShift , то выход (выбран) равен 08,если timeNow равно 07, timeShift , то выход (выбран) равен 06,если timeNow равно 09, timeShift , то выход (выбран) равен 08,если timeNow равно 23, timeShift , выход (выбран) равен 22,,,,,,,,продолжается как структура данных timeNow и timeShift , как и ожидалось там.

Как я могу решить проблему?Помогите мне, пожалуйста.Спасибо:)

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Если вам нужно найти ближайшее единственное значение, которое меньше или равно заданному, вам нужно лишь небольшое обновление вашего кода:

function getTime(timeNow) {
var timeShift = ["08", "10", "12", "14", "16", "18", "20", "22", "00", "02", "04", "06"];
var newTime = '00';
for (var data of timeShift)
  if (data <= timeNow && data >= newTime)
    newTime = data;

return newTime;
}

console.log(getTime('08'));
console.log(getTime('07'));
console.log(getTime('09'));
console.log(getTime('23'));
0 голосов
/ 24 октября 2018

Похоже, вы хотите самое высокое значение меньше или равно сейчас.Это можно сделать с помощью комбинации filter (чтобы сначала отфильтровать значения из timeShift, которые меньше или равны вашей цели) и reduce (чтобы найти максимум этих отфильтрованных значений):

var timeShift = ["08", "10", "12", "14", "16", "18", "20", "22", "00", "02", "04", "06"];

function highestUnder(now) {
  now = parseInt(now);
  return timeShift.filter(t => parseInt(t) <= now)
                  .reduce((a, c) => parseInt(c) > parseInt(a) ? c : a);
}

console.log(highestUnder("08"));
console.log(highestUnder("07"));
console.log(highestUnder("09"));
console.log(highestUnder("23"));
0 голосов
/ 24 октября 2018

Один из способов сделать это, когда у вас есть массив newData, вы можете просто найти ближайший номер к переменной 'timeNow' в этом массиве.Это, вероятно, неэффективно, но должно дать вам желаемый результат.Добавление следующего должно сделать трюк:

var closest = newData.reduce(function(prev, curr) {
  return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev);
});

console.log(closest);
0 голосов
/ 24 октября 2018

Вы можете отфильтровать значения, взяв числовое значение для сравнения и значение, уменьшенное на единицу для проверки.

const getN = s => parseInt(s, 10),
      check = (strong, weak) => strong === weak -1 || strong === weak;
  
var timeNow = "07",
    timeShift = ["08","10","12","14","16","18","20","22","00","02","04","06"],
    result = timeShift.filter(s => check(getN(s), getN(timeNow)));

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...