Javascript 删除元素时如何保留数组键?

Javascript 删除元素时如何保留数组键?,javascript,arrays,Javascript,Arrays,我想通过随机插入字符来构建一个文本字符串,但要按顺序插入(作为一种效果)。到目前为止,我已经: // make a string and an array var input = "Hello, world!", output = []; // split the string input = input.split(''); 我的想法是把这个叫做 function addAnElement(){ // check if there are any left if(input.

我想通过随机插入字符来构建一个文本字符串,但要按顺序插入(作为一种效果)。到目前为止,我已经:

// make a string and an array
var input = "Hello, world!",
    output = [];
// split the string
input = input.split('');
我的想法是把这个叫做

function addAnElement(){
  // check if there are any left
  if(input.length){
     // pick an element at random
     var rand = Math.floor(Math.random() * input.length);
     // remove it, so we don't call it again
     var element = input.splice(rand,1);
     // insert it
     output[rand] = element;
     // use the string returned as new innerHTML, for example 
     return output.join('');
     // repeat until finished
     setTimeout(addAnElement,5);
  }
}
我希望这会带来如下结果:

'e'
'er'
...
'Hel, or!'
...
'Helo, Word!'
... and finally ...
'Hello, World!'
当然,问题是数组在拼接时会被重新索引,这会产生乱码。我认为答案必须是将元素链接到它们在
input
中的位置,然后完整地插入它们,如有必要,在返回之前按键排序。
如何执行此操作?

您可以通过不使用
拼接来避免此操作。相反,当您使用某个条目时,请清除该条目,并对已清除的条目进行计数

例如:

当然,循环拾取随机数可能会在最后几个字符中持续一段时间。若您对此感到担忧,您可以创建一个随机的索引数组来提前使用。解决这个问题

实例:

var input=“你好,这里!”.split(“”);
var输出=[];
var entriesLeft=输入长度;
函数addAnElement(){
//随机选取一个元素,如果我们已经
//选了那个
var rand;
做{
rand=Math.floor(Math.random()*input.length);
}
而(!input[rand]);
//明白了
变量元素=输入值[rand];
//清除它,这样我们就不会再使用它了
输入[rand]=未定义;
//插入它
输出[rand]=元素;
//重复,直到完成
如果(--entriesLeft){
setTimeout(addAnElement,5);
}
//例如,使用作为新innerHTML返回的字符串
document.body.innerHTML=output.join(“”);
}

添加元素()像这样的东西怎么样:

var input = 'Hello world',
    inputIndexes = [],
    output = [];

for (var i = 0; i < input.length; i++) { 
    inputIndexes[i] = i;
};

function addAnElement() {
    if (inputIndexes.length) {
        var rand = Math.floor(Math.random() * inputIndexes.length);
        var element = inputIndexes.splice(rand, 1);
        output[element] = input[element];
        //console.log(output.join(' '));
        document.getElementById('text').innerHTML = output.join(' ');
        setTimeout(addAnElement, 2000);

    }
}

addAnElement();
var输入='Hello world',
InputIndex=[],
输出=[];
对于(var i=0;i

您可以保存第二个索引数组,并在两个数组中进行拼接,然后从第二个数组中获取索引。eah,我不需要返回任何东西来使函数工作,但在我的实际代码中,我正在从函数中编写,就像您在上面的代码片段中使用
document.body.innerHTML所做的那样,谢谢。我曾尝试将值设置为
undefined
,以保留数组键,但是实际的字符串要比这个长得多,为了寻找我们都知道应该是答案的东西而反复滚动1000面骰子似乎是在浪费能量。@Isaacrubow:这就是为什么我链接到关于创建随机数组(例如索引)的问题和答案。然后循环遍历随机索引数组,并使用这些索引处的字符。这就是说,对Chrome的快速测试表明,现代JavaScript引擎将在十分之二毫秒内发现千分之一的数字。当然,在您的目标浏览器/设备上进行测试。是的,我们可以对输入进行洗牌,但我们如何知道索引[0]处的[随机选择的字符]在输出字符串中的位置?这些键没有被保留。@IsaacLubow:您没有洗牌输入。创建第二个索引数组,并将其洗牌。然后使用每个索引遍历该数组。
var input = 'Hello world',
    inputIndexes = [],
    output = [];

for (var i = 0; i < input.length; i++) { 
    inputIndexes[i] = i;
};

function addAnElement() {
    if (inputIndexes.length) {
        var rand = Math.floor(Math.random() * inputIndexes.length);
        var element = inputIndexes.splice(rand, 1);
        output[element] = input[element];
        //console.log(output.join(' '));
        document.getElementById('text').innerHTML = output.join(' ');
        setTimeout(addAnElement, 2000);

    }
}

addAnElement();