Инкрементная конкатенация строк в цикле for по какой-то причине игнорирует "0" - PullRequest
0 голосов
/ 01 октября 2019

Я пишу функцию для получения числовой строки из строки`, которая работает следующим образом:

  • Для каждого символа в строке проверяется, является ли это цифра от 0 до9
  • Если это так, включает его в новую строку
  • Продолжается до конца строки. Если строка a0b109mmn5, функция должна вернуть 01095.
function stringToDigit(string) {
    if (string.length == 1) {
        switch (string) {
            case "0":
                return 0;
            case "0":
                return 0;
            case "1":
                return 1;
            case "1":
                return 1;
            case "2":
                return 2;
            case "2":
                return 2;
            case "3":
                return 3;
            case "3":
                return 3;
            case "4":
                return 4;
            case "4":
                return 4;
            case "5":
                return 5;
            case "5":
                return 5;
            case "6":
                return 6;
            case "6":
                return 6;
            case "7":
                return 7;
            case "7":
                return 7;
            case "8":
                return 8;
            case "8":
                return 8;
            case "9":
                return 9;
            case "9":
                return 9;
        }
    }
}
function stringToNum(string) {
    var numString = "";
    for (var i = 0; i < string.length; i++) {
        if (stringToDigit(string[i])) numString += string[i];
    }
    return numString;
}
// $.writeln(stringToDigit("0"));
// $.writeln(stringToNum("000"));
console.log(stringToDigit("0")); // gets 0, good
console.log(stringToDigit("00")); // gets undefined, good
console.log(stringToDigit("a")); // gets undefined, good
console.log(stringToNum("a000b1c2d3e4f5g6h7i8j9")); // gets 123456789, not 000123456789, NOT GOOD!

Однако по какой-то причине я не могу включить "0" в результат. Я пробовал и код Visual Studio (с надстройкой консоли, имя которой я забыл) и Adobe ExtendScript Toolkit CC, поэтому мне интересно, так ли это, как работает JavaScript.

Ответы [ 2 ]

3 голосов
/ 01 октября 2019

if (stringToDigit(string[i])) - похоже на if(0), где 0 приведено к false. Вместо этого используйте if (stringToDigit(string[i]) !== null).

if оператор использует == (не ===) по умолчанию. Поэтому у нас есть некоторые преобразования, такие как:

  • null в false и
  • 0 в false.

Обратите внимание, чтов некоторых случаях вы должны проверить undefined. В вашем случае значение по умолчанию отсутствует, поэтому либо добавьте null по умолчанию, либо установите значение undefined: if (stringToDigit(string[i]) !== undefined)

0 голосов
/ 01 октября 2019

Пока Алекс отлично отвечает на ваш вопрос, у меня было несколько минут и я немного реорганизовал то, что использовал бы, если бы мне пришлось выполнить вашу задачу.

function stringToNum(str) {
  // Object with all the string numbers and their digit equivalent
  var replacements = {
    "0": 0,
    "0": 0,
    "1": 1,
    "1": 1,
    "2": 2,
    "2": 2,
    "3": 3,
    "3": 3,
    "4": 4,
    "4": 4,
    "5": 5,
    "5": 5,
    "6": 6,
    "6": 6,
    "7": 7,
    "7": 7,
    "8": 8,
    "8": 8,
    "9": 9,
    "9": 9,
  };

  var re = new RegExp(Object.keys(replacements).join("|"),"gi");

  // Do all the replacements on characters matching object keys
  return str.replace(re, function(matched){
    return replacements[matched];
  })
  // Remove all the characters that are not a digit
  .replace(/\D+/g, '');
}
console.log(stringToNum("a000b1c2d3e4f5g6h7i8j9"));

Этот путь должен быть быстрее иизбегайте ложной ловушки 0.

Здесь jsbin

...