Проверка типа данных из строкового ввода в JavaScript

#javascript #typescript #data-structures

#javascript #typescript #структуры данных

Вопрос:

Я пытаюсь получить тип данных (?) из строкового входного значения.

 const data = ['1', 'hello', '[]', '{key: [value]}', '`2020-10-08`'];

function funct(data: string): DataType {
    if(??) {
        return Object
    } else if(??) {
        return Number
    } else if(??) {
        return Array
    } else if (??) {
        return Date
    }
    return String
}

data.map((d) => console.log(funct(data)));
// Number, String, Array, Object, Data
  

 function funct(d) {
    if(d.startsWith('{') amp;amp; d.endsWith('}')) {
        return typeof {}
    } else if(d.indexOf('-') !== -1 amp;amp; !isNaN(Date.parse(d))) {
        return 'Date';
    } else if(!isNaN(parseFloat(d))) {
        return typeof 1
    } else if(d.startsWith('[') amp;amp; d.endsWith(']')) {
        return typeof []
    } else return typeof 'string'
}
console.log('number', funct('1'));
console.log('number', funct('123'));
console.log('string', funct('`as2d`'));
console.log('string', funct('2s2d'));
console.log('Object', funct('{}'));
console.log('Array', funct('[]')); //object :( 
console.log('Array', funct('["d", "f"]')); //object :(
  

Комментарии:

1. это может быть слишком сложно

2. Вам придется создать свой собственный анализатор JS, если вы не можете использовать встроенный анализатор ( eval ), что очень часто не является безопасным решением.

3. Не могли бы вы привести мне пример?

4. Object.prototype.toString.call(eval('1'))

5. хм, я думаю, мне нужно создать свой собственный анализатор JS… Не могли бы вы помочь мне с этим?

Ответ №1:

Вы можете попробовать что-то вроде этого:

 function funct(d) {
    
    if(d.startsWith('{') amp;amp; d.endsWith('}')) {
        return Object
    } else if(d.indexOf('-') !== -1 amp;amp; !isNaN(Date.parse(d))) {
        return Date;
    } else if(!isNaN(parseFloat(d))) {
        return Number
    } else if(d.startsWith('[') amp;amp; d.endsWith(']')) {
        return Array
    } else return String
}

  

Примечание: это было протестировано в JS, поэтому я удалил аннотации типов. Пожалуйста, если вы хотите скомпилировать его в TypeScript.

Комментарии:

1. Это то, что я искал!

2. Я только что отредактировал свой вопрос. Не могли бы вы проверить мои тестовые примеры? Сбой: (

3. число функция Номер () { [собственный код] } число функция Номер() { [собственный код] } строка функция Строка() { [собственный код] } строка функция Номер() { [собственный код] } Объект функция Объект() { [собственный код] } Массив функция Массив(){ [собственный код] } Функция массива Array() { [собственный код] } Это результат, когда я запускал ваш код. Для меня все в порядке

4. Для массива не возвращайте значение typeof . Массив — это объект в JavaScript