【问题标题】:javascript syntax question about splice in this statement -> copy.push(array.splice(i,1)[0])此语句中关于 splice 的 javascript 语法问题 -> copy.push(array.splice(i,1)[0])
【发布时间】:2018-09-27 02:56:25
【问题描述】:

所以这是一个语法问题,我一直在阅读 MDN 文档,但找不到类似的示例。我在阅读随机数组时从这里得到了这个特殊的代码 sn-p:https://bost.ocks.org/mike/shuffle/

这是完整的功能:

    function shuffle(array) {
        var copy = [], n = array.length, i;

        // While there remain elements to shuffle…
        while (n) {

            // Pick a remaining element…
            i = Math.floor(Math.random() * n--);

            // And move it to the new array.
            copy.push(array.splice(i, 1)[0]);
        }

        return copy;
    }

现在,我已经使用它并对其进行了修改以满足我的需要,并且效果很好(尽管拼接是一场噩梦,因为它一直在破坏我的原始数据)但这里的重点是这一行:

copy.push(array.splice(i, 1)[0]);

我讨厌不理解一些看似基本的东西,但在这种情况下 [0] 做了什么?如果我把它拿出来,整个东西都会坏掉,但我不确定它是拼接的一部分,还是推送的一部分,或者它是否是新数组或拼接数组的索引。如果有人可以帮助阐明这一点,我将不胜感激!

【问题讨论】:

    标签: javascript arrays syntax


    【解决方案1】:

    让我们分解

    copy.push(array.splice(i, 1)[0]);
    

    按照“执行”的顺序

    array.splice(i, 1);
    

    array.splice(n, m) 删除 m 开始和索引 n 的元素并将这些删除的元素作为数组返回...所以在这种情况下,您会得到一个长度为 1 的数组 - 我们称之为 x

    x替换原代码中的array.splice(i, 1),我们现在有了

    copy.push(x[0]);
    

    x[0] 是从 array 中删除的唯一元素 - 被推送到 copy 数组

    防止传入数组被变异

    function shuffle(array) {
        var copy = [], n = array.length, i;
        array = array.slice();
        // rest of code
    }
    

    顺便说一句,你也可以这样做

    copy.push(array.splice(i, 1).pop());
    

    copy.push(array.splice(i, 1).shift());
    

    【讨论】:

      猜你喜欢
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 2019-12-06
      相关资源
      最近更新 更多