Это кажется очень простым вопросом, но я нигде его не нашел.
Как я могу узнать, существует ли значение на карте?
Например:
A = [1,2,3,5,6,7]
var myMap = new Map();
for (let i = 0; i < A.length; i++) {
myMap.set(i,A[i]);
}
for (let z = 1; z < Number.MAX_SAFE_INTEGER; z++) {
console.info(z);
if (!myMap.hasValue(z)){
return z;
}
}
Я хочу проверить, находится ли это значение в хэше с учетом одного значения. Как «hasValue».
@ 4castle, зачем использовать помощь Set?
@bugs Если вы посмотрите на их код, их карта - это просто логическое воссоздание массива, из которого она создана. Им нужно сделать значения ключами.
Ну, конечно, но я полагаю, что это просто упрощенный пример более сложной проблемы. Если это не так, конечно, вы правы.



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


Используйте Map.has(z), как описано на MDN
OP хочет проверить, есть ли на карте значение, и не хочет проверять, установлен ли ключ.
Точно. Я не хочу знать, есть ли на нем ключ. Но ценность. Я знаю, что могу получить Object.values карты и дать Array.find, но мне это не нравится
Вы можете использовать итерацию по карте, искать значение и возвращать истину (выход из цикла), как только вы его найдете. Или вы вернете false, если элемент не существует. Что-то вроде:
const findInMap = (map, val) => {
for (let [k, v] of map) {
if (v === val) {
return true;
}
}
return false;
}
for (let v of map.values())Я лично предпочитаю find, indexOf и findIndex.
const array1 = (map, val) => {
var foo;
array2.find( (x) => foo = x === foo.id )
return foo;
}
Вы не можете, кроме как поиском в нем:
Array.from(myMap.values()).includes(val)
Вместо этого используйте соответствующую структуру данных, например набор всех значений:
A = [1,2,3,5,6,7]
var myValues = new Set(A);
for (let z = 1; z < Number.MAX_SAFE_INTEGER; z++) {
console.info(z);
if (!myValues.has(z)) {
return z;
}
}
Конечно, учитывая тот факт, что ваш A уже отсортирован, вы можете выполнить итерацию напрямую, чтобы найти наименьшее пропущенное значение.
Если он отсортирован, вам не следует выполнять итерацию, вы должны выполнить двоичный поиск - это будет намного быстрее.
@VitaliyLebedev Нет, я действительно имел в виду итерацию здесь, поскольку код ищет наименьшее целое число, которого нет в массиве. Двоичный поиск не помогает, поскольку мы не знаем, какое значение ищем - вам просто нужно перебирать целые числа и массив, как при слиянии, пока вы не найдете то, что отсутствует.
Я знаю, что на этот вопрос уже дан ответ, но я хотел бы указать способ сделать это без (явного) повторения записей. Ты можешь сделать
let myMap = new Map([[0, 1], [1, 2], [2, 3], [3, 5], [4, 6], [5, 7]])
for (let z = 1; z < Number.MAX_SAFE_INTEGER; ++z) {
console.info(z);
if ([...myMap.values()].includes(z) === false){
return z;
}
}
Итак, вы можете создать функцию
const mapContainsElement = (map, val) => [...map.values()].includes(v)
Для меня это работает:
Object.values(myMap).includes(myValue);
Похоже, вы используете неправильную структуру данных. Вместо этого используйте
Set.var mySet = new Set(A);