JS数组拼接由于某些原因没有删除索引

JS array splice don't remove the index for some reason

本文关键字:删除 索引 数组 拼接 于某些 JS      更新时间:2023-09-26

这是我要发送的代码:

for (var com = 0; com < 10; com++) {
        var op = [0, 1, 2, 3];
        combo = op[Math.floor(Math.random() * op.length)];
        door1[com] = combo;
        op.splice(combo, 1);
        combo = op[Math.floor(Math.random() * op.length)];
        door2[com] = combo;
        op.splice(combo, 1);
        combo = op[Math.floor(Math.random() * op.length)];
        door3[com] = combo;
        op.splice(combo, 1);
        combo = op[Math.floor(Math.random() * op.length)];
        door4[com] = combo;
        eim.print(op.toString());
}

现在当我打印op数组时。我应该只得到一个值,因为我已经删除了其他的索引。用剪接。但当我打印结果10次时。我发现有些索引没有被删除。我尝试着创造4种不同的连击。每个组合都是不同的

你正在做的是,

Array.splice(combo,1);

现在它试图做的是拼接数组中索引为combo的元素,现在combo可以是任何值,而不是索引。

你可以通过索引试试,FIDDLE

代码:

door1={}
door2={}
door3={}
door4={}
var index=null;
for (var com = 0; com < 10; com++) {
        var op = [0, 1, 2, 3];
        index=Math.floor(Math.random() * op.length)
        combo = op[index];
        door1[com] = combo;
        op.splice(index, 1);
        index=Math.floor(Math.random() * op.length)
        combo = op[index];
        door2[com] = combo;
        op.splice(index, 1);
        index=Math.floor(Math.random() * op.length)
        combo = op[index];
        door3[com] = combo;
        op.splice(index, 1);
        index=Math.floor(Math.random() * op.length)
        combo = op[index];
        door4[com] = combo;
        document.write(op.toString()+'<br>');
}

仅取门数组的拼接元素。Array.prototype.splice返回一个数组,所以对于一个数组,取第一个元素,索引为[0]

door4的最后一个赋值不需要随机计算,只取数组op的单个元素。

var combo, com, door1 = [], door2 = [], door3 = [], door4 = [], op;
for (com = 0; com < 10; com++) {
    op = [0, 1, 2, 3];
    door1[com] = op.splice(Math.random() * op.length | 0, 1)[0];
    door2[com] = op.splice(Math.random() * op.length | 0, 1)[0];
    door3[com] = op.splice(Math.random() * op.length | 0, 1)[0];
    door4[com] = op[0];
}
document.write('door1: ' + door1 + '<br>');
document.write('door2: ' + door2 + '<br>');
document.write('door3: ' + door3 + '<br>');
document.write('door4: ' + door4 + '<br>');

您需要使用项目的索引从数组中删除它,而不是值

var door1 = {},
  door2 = {},
  door3 = {},
  door4 = {};
for (var com = 0; com < 10; com++) {
  var op = [0, 1, 2, 3];
  door1[com] = getValue(op);
  door2[com] = getValue(op);
  door3[com] = getValue(op);
  door4[com] = getValue(op);
  snippet.log(JSON.stringify(op));
  console.log(op)
}
function getValue(array) {
  var idx = Math.floor(Math.random() * array.length),
    val = array[idx];
  array.splice(idx, 1);
  return val;
}
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>