Как я могу проверить, существует ли значение на карте в Javascript?

Это кажется очень простым вопросом, но я нигде его не нашел.

Как я могу узнать, существует ли значение на карте?

Например:

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».

Похоже, вы используете неправильную структуру данных. Вместо этого используйте Set. var mySet = new Set(A);

4castle 28.04.2018 15:50

@ 4castle, зачем использовать помощь Set?

bugs 28.04.2018 16:05

@bugs Если вы посмотрите на их код, их карта - это просто логическое воссоздание массива, из которого она создана. Им нужно сделать значения ключами.

4castle 28.04.2018 16:07

Ну, конечно, но я полагаю, что это просто упрощенный пример более сложной проблемы. Если это не так, конечно, вы правы.

bugs 28.04.2018 16:09
Поведение ключевого слова "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) для оценки ваших знаний,...
12
4
23 332
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Используйте Map.has(z), как описано на MDN

OP хочет проверить, есть ли на карте значение, и не хочет проверять, установлен ли ключ.

t.niese 28.04.2018 15:39

Точно. Я не хочу знать, есть ли на нем ключ. Но ценность. Я знаю, что могу получить Object.values ​​карты и дать Array.find, но мне это не нравится

Fernando Maymone 28.04.2018 15:41
Ответ принят как подходящий

Вы можете использовать итерацию по карте, искать значение и возвращать истину (выход из цикла), как только вы его найдете. Или вы вернете false, если элемент не существует. Что-то вроде:

const findInMap = (map, val) => {
  for (let [k, v] of map) {
    if (v === val) { 
      return true; 
    }
  }  
  return false;
}
for (let v of map.values())
Thomas 28.04.2018 16:12

Я лично предпочитаю find, indexOf и findIndex.

const array1 = (map, val) => {
  var foo;
  array2.find( (x) => foo = x === foo.id )
  return foo;
}

findIndex

найти

индекс чего-либо

Вы не можете, кроме как поиском в нем:

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 уже отсортирован, вы можете выполнить итерацию напрямую, чтобы найти наименьшее пропущенное значение.

Если он отсортирован, вам не следует выполнять итерацию, вы должны выполнить двоичный поиск - это будет намного быстрее.

Vitaliy Lebedev 19.06.2019 03:43

@VitaliyLebedev Нет, я действительно имел в виду итерацию здесь, поскольку код ищет наименьшее целое число, которого нет в массиве. Двоичный поиск не помогает, поскольку мы не знаем, какое значение ищем - вам просто нужно перебирать целые числа и массив, как при слиянии, пока вы не найдете то, что отсутствует.

Bergi 19.06.2019 12:22

Я знаю, что на этот вопрос уже дан ответ, но я хотел бы указать способ сделать это без (явного) повторения записей. Ты можешь сделать

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);

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