.replace не является функцией - не мог понять это

javascript replace

73 просмотра

1 ответ

Это новая редакция моего вопроса, надеюсь, она будет соответствовать критериям и будет считаться приемлемой.

Сначала мне удалось решить проблему. Я сейчас опишу ситуацию и какое я думаю решение, которое решит проблему.

Мой код получает строку (номер вызова) в качестве входных данных, переформатирует ее, анализирует до плавающего значения и возвращает местоположение номера вызова в пределах заданного набора диапазонов.

Код состоит из двух функций: 1. formatCallNumber(callNum)которая выполняет манипулирование текстом с вводом. 2. SortCallNum(callNumInput)- отвечает за сортировку по диапазонам.

Проблема заключалась в передаче значений диапазонов номеров вызовов от функции сортировки (№ 2) до функции форматирования (№ 1). Хотя я проанализировал эти значения как строки в функции сортировки, .replaceфункция выдала ошибку. Решение, которое я (думаю) работал, состояло в том, чтобы проанализировать значения в строках в функции форматирования.

Код двух функций ниже обновлен и, кажется, работает как ожидалось:

функция 1 - функция форматирования:

function formatCallNumber(callNum){
  var formatedCallNum = String(callNum);
  formatedCallNum = formatedCallNum.replace(/\D/g,''); // remove all but digits chars from the string (whitespace, dots, etc)
  formatedCallNum = "0." + formatedCallNum; // add "0." to the callNumber string
  formatedCallNum = parseFloat(formatedCallNum); // parse as float - so it could be compared with other decimals
  return (formatedCallNum);
}

Функция 2 - функция сортировки:

function SortCallNum(callNumInput){
// data [test only]
var shelves = {
    "S1" : {"callStart":"100","callEnd": "223.456", "id": 1},
    "S2" : {"callStart":"223.457","callEnd": "334", "id": 2},
    "S3" : {"callStart":"335","callEnd": "535", "id": 3},
    "S4" : {"callStart":"536","callEnd": "638", "id": 4},
    "S5" : {"callStart":"639","callEnd": "847", "id": 5}
    };
var matchId = "";
document.getElementById("somthing").innerHTML += "you typed the number: " + callNumInput; // output of callNumInput (as inserted by user) 
formatedCallNum = formatCallNumber(callNumInput);

// traverse into shelves object : iteration of objects (key = s1-s5)
for (var key in shelves) {
    if (shelves.hasOwnProperty(key)) {
        matchId = shelves[key].id;
        document.getElementById("somthing").innerHTML += "<br>" + (" -- " + "CallEnd is: " + " -- " + shelves[key].callEnd); // display values of object shelves.key.callend
        document.getElementById("somthing").innerHTML += "<br>" + (" -- " + "CallStart is: " + " -- " + shelves[key].callStart); // display values of object shelves.key.callend
        var formatedCallRangeStart =   formatCallNumber(shelves[key].callStart);
        var formatedCallRangeEnd = formatCallNumber(shelves[key].callEnd);
        console.log(formatedCallRangeStart);
        console.log(formatedCallRangeEnd);
        if ((formatedCallNum <= 0) || (formatedCallNum > 1)){alert('call number not in proper range'); break;}      
        if ((formatedCallRangeStart <= formatedCallNum)&&(formatedCallRangeEnd >= formatedCallNum)){break;}
     }
 }

Спасибо за помощь.

Автор: hagay bar Источник Размещён: 08.11.2019 11:17

Ответы (1)


0 плюса

Решение

Как я вижу, каждый должен работать как положено. Очень важно , чтобы пройти stringINTO SortCallNum, а не number.

function SortCallNum(callNumInput){
    // data [test only]
    var shelves = {
        "S1" : {"callStart":100,"callEnd": "223", "id": 1},
        "S2" : {"callStart":224,"callEnd": "334", "id": 2},
        "S3" : {"callStart":335,"callEnd": "535", "id": 3},
        "S4" : {"callStart":536,"callEnd": "638", "id": 4},
        "S5" : {"callStart":639,"callEnd": "847", "id": 5}
    };
    var matchId = "";
    document.getElementById("somthing").innerHTML += "you typed the number: " +     callNumInput; // output of callNumInput (as inserted by user) 
    formatedCallNum = formatCallNumber(callNumInput);

    // traverse into shelves object : iteration of objects (key = s1-s5)
    for (var key in shelves) {
        if (shelves.hasOwnProperty(key)) {
            matchId = shelves[key].id;
            document.getElementById("somthing").innerHTML += "<br>" + (" -- " + "CallEnd is: " + " -- " + shelves[key].callEnd); // display values of object shelves.key.callend
            document.getElementById("somthing").innerHTML += "<br>" + (" -- " + "CallStart is: " + " -- " + shelves[key].callStart); // display values of object shelves.key.callend
            var formatedCallRangeStart = String(shelves[key].callStart);
            formatedCallRangeStart = formatCallNumber(formatedCallRangeStart);
            var formatedCallRangeEnd = String(shelves[key].callEnd);
            formatedCallRangeEnd = formatCallNumber(formatedCallRangeEnd);
            matchId = shelves[key].id;
            if ((formatedCallRangeStart <= formatedCallNum)&&(formatedCallRangeEnd >= formatedCallNum)){
                break;
            }
        }
    }
    alert (matchId);
}

function formatCallNumber(callNum){

    // callNum = prompt('enter a call number: ');
    formattedCallNum = callNum.replace(/\D/g,''); // remove all but digits chars    from the string (whitespace, dots, etc)
    formattedCallNum = "0." + formattedCallNum; // add "0." to the callNumber string
    formattedCallNum = parseFloat(formattedCallNum); // parse as float - so it could be compared with other decimals
    return (formattedCallNum);
}

SortCallNum('1337')
<div id="somthing"></div>

Итак, это будет работать SortCallNum('1337'), это не SortCallNum(1337)...

Другой возможной причиной является то, что вы доверяете возвращаемому значению promptвслепую.

<button type="button" onclick="var callNumInput = prompt('enter a call number: '); SortCallNum(callNumInput);"> SortCallNum(test)</button>

Когда пользователь нажимает кнопку ОК, возвращается текст, введенный в поле ввода. Если пользователь нажимает «ОК» без ввода текста, возвращается пустая строка. Если пользователь нажимает кнопку «Отмена», эта функция возвращаетсяnull .
https://developer.mozilla.org/en-US/docs/Web/API/Window/prompt#Example

Немного санитарной обработки должно помочь:

if (callNumInput == null) {
  throw new Error('You have to insert a number between 0 and 999.')
}
Автор: yckart Размещён: 20.08.2016 12:28
Вопросы из категории :
32x32