¿Por qué Javascript es igual a 5== 8 como verdadero?
html checkbox (3)
Así que tengo 2 casillas de verificación:
var statusList = [];
function updateStatusString(x) {
if (statusList != null) {
if (statusList.length > 0) {
for (var i = 0; i < statusList.length; i++) {
if (parseInt(statusList[i]) == parseInt(x)) {
statusList[i] = 123;
} else {
statusList.push(x);
}
}
} else {
statusList.push(x);
}
}
alert(statusList);
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
Cuando hago clic en una casilla de verificación, la agrega a una lista de JavaScript, si ya está en la lista, quiero sobrescribirla con otro valor (123 en este ejemplo).
Pero cuando hago clic en el segundo (no importa el orden, el segundo elemento siempre es 123 por alguna razón).
Donde, como lo esperaría, si hago clic en la casilla de verificación superior sería una lista que contiene ''5'', luego, al hacer clic en la segunda casilla de verificación, esperaría 5,8 pero se alerta como
5,123
, no veo realmente por qué está funcionando esto como
5==8
es falso ... ¿alguna idea?
Algoritmo actualizado para solucionar el problema subyacente:
En caso de que alguien alguna vez lo encuentre útil, cambié el algoritmo a una mejor alternativa:
var statusList = [];
function updateStatusString(x) {
if (statusList.length > 0) {
if (statusList.includes(x)) {
var idx = statusList.indexOf(x);
if (idx != -1) {
statusList.splice(idx, 1);
}
}
else {
statusList.push(x);
}
} else {
statusList.push(x);
}
alert(statusList);
}
Parece que el bucle estaba causando tu problema.
-
Estabas comprobando la existencia de
x
, que en el primer bucle era falso - Lo empujaste a la matriz
- Segundo bucle, existió y fue reemplazado por 123.
Puede simplificar drásticamente su código eliminando uno de los controles if, y utilizando array.prototype.includes lugar de realizar un bucle y verificar la igualdad.
Edición: Se agregó una tercera entrada para demostrar que se agregó 123 .
var statusList = [];
function updateStatusString(x) {
if (statusList != null) {
if (statusList.includes(x)) {
statusList[statusList.indexOf(x)] = 123;
} else {
statusList.push(x);
}
}
alert(statusList);
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("5")> "Active"</label>
Porque estás iterando sobre la lista de
statusList
.
En la primera iteración, verifica si 5 == 8, luego se mueve a la parte else e inserta
8
en
statusList
.
Su statusList es = [5, 8].
Para la siguiente iteración, esto se convierte en verdadero.
statuslist[i]
será 8 y 8 === 8 y su declaración -
statusList[i] = 123;
Reemplazará los últimos
8
valores insertados con
123
.
Por lo tanto, la matriz statusList tendrá
["5", 123]
.
var statusList = [];
function updateStatusString(x) {
const input = parseInt(x);
if (statusList != null) {
if (statusList.includes(input)) {
const idx = statusList.indexOf(input);
statusList[idx] = 123;
} else {
statusList.push(input);
}
alert(statusList);
}
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>
primera iteración:
ya que la lista de estado está vacía, estás agregando 5 en ella,
segunda iteración:
statulsList = [5]
está agregando 8 por lo que ahora el valor de statusList es [5,8] lo que significa que también la longitud es 2,
así que tenemos una tercera iteración que en este caso 8 === 8.
si desea que sea diferente, guarde la longitud de la lista de estado antes de agregar el otro elemento en la lista.
var statusList = [];
function updateStatusString(x) {
if (statusList != null) {
if (statusList.length > 0) {
var lengthStat = statusList.length;
for (var i = 0; i < lengthStat; i++) {
if (parseInt(statusList[i]) == parseInt(x)) {
statusList[i] = 123;
} else {
if(! (statusList.indexOf(x) != -1))
statusList.push(x);
}
}
} else {
statusList.push(x);
}
}
alert(statusList);
}
<label> <input type="checkbox" name="Active" value="5" onchange=updateStatusString("5")> "Active"</label>
<label> <input type="checkbox" name="NonActive" value="8" onchange=updateStatusString("8")> "Active"</label>