从数组中删除项目并将其添加到另一个数组

时间:2014-09-15 22:03:56

标签: javascript arrays

我正在尝试从数组中删除一个项目并将其添加到另一个数组中。数组状态由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的新手,需要帮助。

2 个答案:

答案 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);