如何检查数组中是否存在对象,如果它不在数组中以推送它



这里有一个测验(李克特类型的测验)。在其中,我想收集问题编号和问答,我可以将其作为单个对象添加到数组中。我有那么多工作。

我需要确定此人是否要更改他们在测验中的答案,如果他们这样做,我需要将他们的旧答案(保存在数组中)替换为该索引位置。如果他们还没有回答某个问题,只需将其推送到问题编号的索引位置即可。

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"与旧答案进行比较。 它每次都会返回 true。 但无论它们是否相同,都永远不会为假。

底部是其他尝试/想法,但我在这个编程方面太业余了。

这是一个问题的 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 以外的按钮属性。

你把问题复杂化了。

请注意,数组索引和问题编号相同,因此无需在数组中搜索答案。它已经在阵列中的位置,或者不是。

推送是向数组添加答案的错误方法,因为这将添加到数组的末尾。您希望将答案插入其正确的数组位置,只需:

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;
}
<div class="container">
<div class="row" id="question_1" data-value="1">
<div class="col-sm-2">
<div class="A">
Q1?
</div>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="10">
<button value="10">5</button>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="8">
<button value="8">
4
</button>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="5">
<button value="5">
3
</button>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="2">
<button value="2">
2
</button>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="0">
<button value="0">
1
</button>
</div>
</div>
<div class="row" id="question_3" data-value="3">
<div class="col-sm-2">
<div class="A">
Q3?
</div>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="10">
<button value="10">
5
</button>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="8">
<button value="8">
4
</button>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="5">
<button id="answer3" value="5">
3
</button>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="2">
<button value="2">
2
</button>
</div>
<div class="col-sm-2" onclick="get_id(this)" value="0">
<button id="answer1" value="0">
1
</button>
</div>
</div>
</div>
<pre id="result"></pre>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" rel="stylesheet">

对我来说,以下似乎是正确的方法。

  1. 筛选问题并排除已回答的问题
  2. 如果它已经在问题中,它将被排除在外,否则问题将保持不变
  3. 添加包含新数据的已回答问题。

代码如下

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

你可以像这样使用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 found = questions.findIndex(v => v.Question === question_num);
if(found === -1){
questions.push(new_answer);
console.log("new question answered");
console.log(questions);
return;
}

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

代码笔,如果你想看到它:)

最新更新