Я сейчас проверяю, какое ближайшее число будет сравниваться с массивом: var testarray1 = [4054,4938,4983,1928,8833]; var test = 5000; var result = testarray1.reduce (function (prev, curr) {...

0
maria 12 Фев 2021 в 09:15

2 ответа

Лучший ответ

Попробуйте, как показано ниже. Объяснение в комментариях.

var testarray1 = ["4000-5595", "4400-4720"];
var postcode = 4630;

// Take two variables to set difference and result
// set difference default value to -1
var difference = -1;
var result = "";

for (var x = 0; x < testarray1.length; x++) {
  // use testarray1[x] instead of testarray1[x][0]
  var selectedPostcode = testarray1[x];
  var splitted = selectedPostcode.split("-");
  var from = parseInt(splitted[0]);
  var to = parseInt(splitted[1]);

  if (postcode >= from && postcode <= to) {
    // get difference
    let currDiff = Math.abs(postcode - from) + Math.abs(postcode - to);
    // difference = -1 means there is no existing value so set current as result
    // check current difference is less than existing one.
    if (difference == -1 || currDiff < difference) {
      difference = currDiff;
      result = selectedPostcode;
    }
  }
}

console.log(result);

Если вам нужно ближайшее значение, основанное на минимальном отличии от любого из значений, используйте let currDiff = Math.min(Math.abs(postcode - from), Math.abs(postcode - to));.

var testarray1 = ["4000-5595", "4400-4720", '4800-5000'];
var postcode = 4630;

// Take two variables to set difference and result
// set difference default value to -1
var difference = -1;
var result = "";

for (var x = 0; x < testarray1.length; x++) {
  // use testarray1[x] instead of testarray1[x][0]
  var selectedPostcode = testarray1[x];
  var splitted = selectedPostcode.split("-");
  var from = parseInt(splitted[0]);
  var to = parseInt(splitted[1]);

  if (postcode >= from && postcode <= to) {
    // get difference
    let currDiff = Math.min(Math.abs(postcode - from), Math.abs(postcode - to));
    // difference = -1 means there is no existing value so set current as result
    // check current difference is less than existing one.
    if (difference == -1 || currDiff < difference) {
      difference = currDiff;
      result = selectedPostcode;
    }
  }
}

console.log(result);
2
Karan 12 Фев 2021 в 06:43

Вы должны проверять каждый интервал и проверять, является ли предыдущий ответ закрытым или текущий интервал является закрытым, и соответственно изменять ответ следующим образом.

var testarray1 = ['4000-5595', '4400-4720']
var test = 4630
let ans

for (var x = 0; x < testarray1.length; x++) {
  var selectedPostcode = testarray1[x]
  var splitted = selectedPostcode.split('-')
  var from = parseInt(splitted[0])
  var to = parseInt(splitted[1])

  if (ans) {
    if (ans[0] < from || ans[1] > to) ans = [from, to]
  } else {
    if (test >= from && test <= to) {
      ans = [from, to]
    }
  }
}

console.log(ans.join('-'))
1
Solvenc1no 12 Фев 2021 в 06:30
66167155