как мне проверить, существует ли объект в массиве, если его нет в массиве до pu sh it - PullRequest
0 голосов
/ 26 мая 2020

Вот у меня викторина (викторина типа Лайкерта). Внутри него я хочу собрать номер вопроса и вопрос-ответ, которые я могу добавить как один объект в массив. столько у меня работает.

Мне нужно определить, должен ли человек изменить свой ответ в викторине, и если он это сделает, мне нужно заменить его старый ответ (который был сохранен в массиве) на это место индекса. Если они еще не ответили на определенный вопрос, просто наберите sh его в индексном месте номера вопроса.

let questions = [];


function get_id(xd,jf){

    let question = (xd.parentNode.id);
    let question_num = document.getElementById(question).getAttribute("value");
    let number = document.getElementById(jf).getAttribute("value");
    let new_answer = {Question:question_num, Answer:number};

    questions.push(new_answer);

    let found = questions.includes(new_answer);

    console.log(found);

    if (found == false) {
        questions.push(new_answer);

    };

    // if (questions.some... " i couldn't understand how to use the some method"

    //for (i = 0; i < questions.length; i++) { "and was thinking about using a for loop somehow."

    console.log(questions);

};

вы можете видеть, что я пытаюсь использовать метод include, который является единственным, что я могу получить, чтобы вернуть bol, но по какой-то причине он фактически не сравнивал "new_answer" с старый ответ. он будет просто возвращать истину каждый раз. но никогда не ложь, независимо от того, что они одинаковы.

внизу - другие попытки / идеи, но я слишком любитель в этом программировании.

вот HTML единственного вопроса, если он имеет какое-либо значение.

div class="row" id="question_1" value="0">
  <div class="col-sm-2">
    <div class="A">
      how are you?
    </div>
  </div>
  <div class="col-sm-2" id="answer5" onclick="get_id(this, id)" value="10">
    <button id="answer5" value="10">
      5
    </button>
  </div>
  <div class="col-sm-2" id="answer4" onclick="get_id(this, id)" value="8">
    <button id="answer4" value="8">
      4
    </button>
  </div>
  <div class="col-sm-2" id="answer3" onclick="get_id(this, id)" value="5">
    <button id="answer3" value="5">
      3
    </button>
  </div>
  <div class="col-sm-2" id="answer2" onclick="get_id(this, id)" value="2">
    <button id="answer2" value="2">
      2
    </button>
  </div>
  <div class="col-sm-2" id="answer1" onclick="get_id(this, id)" value="0">
    <button id="answer1" value="0">
      1
    </button>
  </div>
</div>

И да, я даже не использую свойства кнопки, кроме стиля lmao.

Ответы [ 3 ]

0 голосов
/ 26 мая 2020

вы можете использовать Array.findIndex вот так. и это намного чище

let questions = [];


function get_id(xd,jf){

    let question = (xd.parentNode.id);
    let question_num = document.getElementById(question).getAttribute("value");
    let number = document.getElementById(jf).getAttribute("value");
    let new_answer = {Question:question_num, Answer:number};

    const founded = questions.findIndex(v => v.Question === question_num);
    if(founded === -1){
      questions.push(new_answer);
      console.log("new question answered");
      console.log(questions);
      return;
    }

    questions[founded].Answer = number;
    console.log("new question updated");
    console.log(questions);

};

код, если вы хотите его увидеть :)

0 голосов
/ 26 мая 2020

Вы слишком усложняете задачу.

Обратите внимание, что индекс массива и номера вопросов идентичны, поэтому нет необходимости искать ответ в массиве. Он уже находится на своем месте в массиве или нет.

Pu sh - неправильный метод добавления ответа в массив, так как это добавит в конец массива. Вы хотите вставить ответ в его правильную позицию в массиве, которая просто:

questions[question_num] = {Question: question_num, Answer: value);

let questions = [];

function get_id(xd) {

  let qDiv = xd.parentNode;
  let question_num = qDiv.dataset.value;
  let value = xd.firstElementChild.value;
  let new_answer = {
    Question: question_num,
    Answer: value
  };

  questions[Number(question_num)] = new_answer;

  result.innerHTML = 'questions: ' +
    JSON.stringify(questions,null,2);
};

let result = document.getElementById('result');
#result {
  border: 1px solid gray;
  margin: 0.3rem;
  padding: 0.5rem;
  font-size: 0.75rem;
}
.row {
  margin-bottom: 0.5rem;
}

  
    
      
        Q1?
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
  

  
    
      
        Q3?
      
    
    
      
    
    
      
    
    
      
    
    
      
    
    
      
    
  

0 голосов
/ 26 мая 2020

Мне кажется, что следующий способ сделать это правильно.

  1. Отфильтруйте вопросы и исключите вопрос, на который дан ответ
  2. Если он уже будет в вопросах он будет исключен, иначе вопросы останутся прежними
  3. Добавьте ответ на вопрос, содержащий новые данные.

Код выглядит следующим образом

questions = questions.filter(q => q.question_num !== new_answer.question_num);

questions.push(new_answer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...