我正在尝试从数组中删除一个项目并将其添加到另一个数组中。数组状态由50个状态列表组成。用户需要输入状态名称,状态必须从states数组中删除并添加到数组correctState。这是我的代码
function searchString()
{
var total = 50;
var string = document.getElementById("txtState").value;
var element = document.getElementById("status");
for (i=0; i < states.length; i++)
{
if(states[i].toUpperCase() == string.toUpperCase())
{
count = count + 1;
//element.innerHTML = "CORRECT!!!"
addElem = states.splice(i,1);
correctState.push(addElem);
/*for (j=0; j < correctState.length; j++)
{
if(correctState[j].toUpperCase() == string.toUpperCase())
{
element.innerHTML = "Already Submitted. Try another State";
}
}*/
}
document.getElementById("score").innerHTML = count +"/"+ total;
document.write(states);
document.write(correctState);
}
}
Enter State : <input type="text" name="txtState" id="txtState"><span id="timer"></span><br /><span id="status"></span>
<button type="button" name="btnPlay" id="btnPlay" accesskey="s" onClick="searchString()"><u>S</u>ubmit</button>
我无法达到我的需要。我是javascript的新手,需要帮助。
答案 0 :(得分:1)
回答这些问题:
addElem = states.splice(i,1);
correctState.push(addElem);
splice
不会返回您删除的元素,它会返回这些元素的数组。因此,您的代码将数组实例推送到correctState
。我这样做:
correctState.push(states[i]); // First push the matching state onto `correctStates`
states.splice(i,1); // ...then remove it
或者,您可以按照您显示的顺序执行此操作,您只需将已删除的元素从您获得的数组中删除
addElem = states.splice(i,1);
correctState.push(addElem[0]);
// Here -----------------^^^
但是我再次推动,然后移除。
另外,我会使用浏览器内置的调试器来单步执行该代码并观察其运行情况。我怀疑你会发现你想要移动一些东西,一旦你发现string
与数组中的某些东西相匹配,你几乎肯定想要停止循环。
答案 1 :(得分:0)
我的猜测是,您仍在枚举时修改了states
数组。
所以说你的状态数组是[AR, LA, CT]
,用户输入了LA
。所以你的for循环就像这样
i = 0 (length is 3 so i < 3)
string not found
i = 1 (length is 3 so i < 3)
string found, remove it from states
i = 2 (length is 2 so i < 2 fails and there's no final loop)
你可能想要的只是这样的东西
function moveAllInstancesBetweenArrays(val, source, destination) {
var indexOfVal = source.map(function(s) { return s.toUpperCase() })
.indexOf(val.toUpperCase());
if(indexOfVal == -1)
return;
source.splice(indexOfVal, 1);
destination.push(val);
moveAllInstancesBetweenArrays(val, source, destination); //continue until all matching are moved
}
moveAllInstancesBetweenArrays(yourSearchVal, states, correctStates);