Проверить тип ключа карты js

Я пытаюсь проверить тип ключа карты, чтобы определить, как его фильтровать. Мой текущий подход состоит в том, чтобы проверить myMap.keys().next().value, что удивительно, похоже, что это undefined, независимо от того, является ли это строкой, int и т.

Мне нужно проверить, является ли ключ целым или пустым. Пока я пробовал это:

!key.next().value // for no key
Number.isInteger(key.next().value) // for a numbered key

Ни один из моих операторов if не запускается с помощью этих проверок.

у вас отсутствует закрывающая скобка во второй строке после value

duxfox-- 09.08.2018 17:08

Можете ли вы опубликовать структуру myMap?

Simranjit Singh 09.08.2018 17:08

Это всего лишь пример кода, мой ide заметил бы это для меня.

Øystein Seel 09.08.2018 17:09

для справки, я не нашел ни одного числового метода, который проверяет правильность работы определенных типов int / number, поэтому на днях я нашел это по другому вопросу: stackoverflow.com/questions/14636536/…function isInt(data) { return typeof data === 'number' && (data % 1) === 0; }

duxfox-- 09.08.2018 17:09

Карта динамическая, и ее структура может быть разной.

Øystein Seel 09.08.2018 17:10

ну, конечно, должен быть пример, который вы можете показать нам

mathmaniac88 09.08.2018 17:11

Вы можете объяснить нам методы .keys() и .next()?

mathmaniac88 09.08.2018 17:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
8
312
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Number.isInteger проверять, только если параметр - число. если вы проверите Number.isInteger ("1") всегда будет возвращать false. чтобы проверить, является ли один ключ числом, попробуйте использовать регулярное выражение, например:

/^\d+$/.test(key.next().value)

это отлично работает в обоих случаях /^\d+$/.test("1 ") и /^\d+$/.test(1)

Это очень распространенная ошибка при работе с цепочкой методов. map.keys() возвращает итератор, на котором выполняется итерация вызова next(). Просто сохраните возвращаемое значение myMap.keys () в переменной, а затем вызовите next (). Value для проверки. Код будет выглядеть примерно так:

let myMap = new Map()

myMap.set("0", "zero")
myMap.set(1, "one")

let iterator = myMap.keys()

console.info(typeof iterator.next().value)
console.info(typeof iterator.next().value)

Приведенный выше фрагмент работает должным образом, но попробуйте запустить следующий фрагмент. Он напечатал бы оба оператора консоли как нить

let myMap = new Map()

myMap.set("0", "zero")
myMap.set(1, "one")

console.info(typeof myMap.keys().next().value)
console.info(typeof myMap.keys().next().value)

Я предполагаю, что у вас есть объект, который является картой, и вы хотите отфильтровать значения на основе ключевого типа, верно?

вы должны использовать тип, чтобы знать тип var:

var test = "2"
console.info(typeof 42);
// expected output: "number"

console.info(typeof 'blubber');
// expected output: "string"

console.info(typeof true);
// expected output: "boolean"

console.info(typeof declaredButUndefinedVariable);
// expected output: "undefined";

Вы можете сделать следующее

var myMap = new Map([[undefined, "fffff"],["2", "uno"], [2, "doios"]]);


for (const key of myMap.keys()) { 
  if (typeof key === 'string'){
    myMap.delete(key);
  }
}

console.info(myMap)

Другой подход: Преобразуйте вашу карту в массив, а затем продолжите фильтровать результат:

var myMap = new Map([[undefined, "fffff"],["2", "uno"], [2, "doios"]]);

var _typeofKey = 'string'; // you can set typeof key: number , string , boolean , symbol , undefined , object , function

var results = Array.from(a).filter(
  function(element){
    var key = element[0];
    var value = element[1];
    if (typeof key === _typeofKey){
    return true;
    }
    return false;
  }
)

// new Map without string keys
var newMap = myMap(results);

Другие вопросы по теме