У меня есть объект, который выглядит так: var object = {"keyword": "next", "other word": "wrong", "test": "wrong"}. Я хочу использовать ввод, который пользователь вводит в текстовое поле, и искать в этом вводе любой из ключей объекта. Если это совпадение, я также хочу, чтобы он проверял, является ли значение этого ключа «следующим». Если это так, я хочу, чтобы он мог запускать функцию. Если ключ совпадает, но значение не является "следующим", я хочу, чтобы он console.log значение.

Вот код, который я сейчас использую:

var object = {"keyword": "next", "other word": "wrong", "test": "wrong"}
var match;
document.addEventListener('keyup', function(e){
    var text = document.getElementById("input").value;
    var options = Object.keys(object);
    if (e.keyCode == 13){
      if(options.some(function(element){
        match = element;
        return text.toString().indexOf(element) != -1;
      })){
        if (object[match].toString() == "next"){
          console.log("next");
          document.getElementById("input").value = "";
        } else {                         
          console.log(object[match]);
          document.getElementById("input").value = "";
        }
    } else {
      document.getElementById("input").value = "";
      console.log("A valid keyword could not be found in your response: please try again!");
    }
  }
});
<input id='input' autofocus>
<div id="gamearea"></div>

Этот код работает нормально до тех пор, пока я не изменю данные объекта, и в этот момент ввод «другого слова» будет выводить не только «неверно», но также «В вашем ответе не найдено допустимое ключевое слово: попробуйте еще раз!» Если вам это нужно, я могу опубликовать больше кода, но я старался не копировать / вставлять весь свой файл. Приветствуются любые решения или даже просто указатели.

0
kevinuulong 30 Окт 2019 в 05:31

3 ответа

Ниже представлено представление о том, как решить проблему с помощью метода Object.entries.

const sentence = "This sentence has a keyword";

const object = {"keyword": "next", "other word": "wrong", "test": "wrong"};

const someFunc = () => {
  console.log("function!");
}

Object.entries(object).forEach(([key, val]) => {
  if (sentence.includes(key)) {
    val === "next" ? someFunc() : console.log('here');
  }
})
0
Nick 30 Окт 2019 в 05:38
Следует учитывать две вещи: caniuse.com/#search=includes и caniuse.com/#search=Object.entries
 – 
Spangle
30 Окт 2019 в 05:51

Получив ввод, вы можете проверить, является ли он свойством вашего object, используя Object.prototype.hasOwnProperty(). Используя обозначение скобок, вы можете затем получить значение свойства, предоставленного в качестве входных данных, чтобы проверить, равно ли оно "next":

var object = {"keyword": "next", "other word": "wrong", "test": "wrong"};
var userInput = "keyword";

if(object.hasOwnProperty(userInput)) { // check that user input is a property . in object
  var value = object[userInput]
  if(value === "next") { // check that the value of the users input is "next"
    // run some function
    console.log("Value next, so we can call a function");
  } else { // the value is not next, so we can log it
    console.log(value);
  }
}
1
Nick Parsons 30 Окт 2019 в 06:32

Ниже приведен базовый пример, который даст вам представление об использовании Object.keys.

var object = {"keyword": "next", "other word": "wrong", "test": "wrong"};

var yourSearchWord = 'keyword';

// Get the key names
var objectKeys = Object.keys(object);

if(objectKeys.indexOf(yourSearchWord) != -1) {
    if(object[yourSearchWord] === 'next') {
        console.log('The value is next');
        // Call your next function
    }
}
0
Spangle 30 Окт 2019 в 06:19
Не тот, кто проголосовал против, но ваш код должен по существу выполнять линейный поиск по всем ключам в объекте, когда вы используете indexOf, вместо этого есть более быстрые подходы к проверке принадлежности ключа к объекту. Кроме того, возможно, вам поможет более подробное объяснение того, как работает ваш код. Не уверен, что это причины, по которым вас отвергли, просто предположение.
 – 
Nick Parsons
30 Окт 2019 в 06:20
1
Да, я согласен с тобой в этом вопросе, Ник, и мне тоже нравится твое решение.
 – 
Spangle
30 Окт 2019 в 06:29