Я пытаюсь проверить тип ключа карты, чтобы определить, как его фильтровать. Мой текущий подход состоит в том, чтобы проверить myMap.keys().next().value, что удивительно, похоже, что это undefined, независимо от того, является ли это строкой, int и т.
Мне нужно проверить, является ли ключ целым или пустым. Пока я пробовал это:
!key.next().value // for no key
Number.isInteger(key.next().value) // for a numbered key
Ни один из моих операторов if не запускается с помощью этих проверок.
Можете ли вы опубликовать структуру myMap?
Это всего лишь пример кода, мой ide заметил бы это для меня.
для справки, я не нашел ни одного числового метода, который проверяет правильность работы определенных типов int / number, поэтому на днях я нашел это по другому вопросу: stackoverflow.com/questions/14636536/…function isInt(data) { return typeof data === 'number' && (data % 1) === 0; }
Карта динамическая, и ее структура может быть разной.
ну, конечно, должен быть пример, который вы можете показать нам
Вы можете объяснить нам методы .keys() и .next()?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


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);
у вас отсутствует закрывающая скобка во второй строке после
value