我在下面写了一个改组程序并通过"Will It Shuffle?"运行它。结果似乎表明它在控制台中工作;它正在改变阵列。但该网站向我显示了一个全红色框,让我觉得我的代码出了问题,但我没有看到它。
function shuffle (array) {
var arr = [],
length = array.length,
el;
while (length > 0) {
var randomEl = Math.floor(Math.random() * (length - 0) - 0);
if (length > 1) {
el = array.splice(randomEl,1);
} else {
el = array.splice(0,1);
}
arr.push(el[0]);
length -= 1;
}
return arr;
}
答案 0 :(得分:1)
该页面忽略函数的返回值,因为它需要in-place排序。
如果您在代码末尾添加它,它会按预期工作:
array.push(...arr);
您也可以直接就地执行此操作:
function shuffle (array) {
var length = array.length;
while (length) {
var randomEl = Math.floor(Math.random() * length);
var el = array.splice(randomEl, 1);
array.push(el[0]);
--length;
}
}
答案 1 :(得分:1)
他们改变了数组,你不改变数组。
您需要更改原始数组,而不是返回新数组。
function shuffle (array) {
var arr = [],
length = array.length,
el;
while (length > 0) {
var randomEl = Math.floor(Math.random() * (length - 0) - 0);
if (length > 1) {
el = array.splice(randomEl,1);
} else {
el = array.splice(0,1);
}
arr.push(el[0]);
length -= 1;
}
//replace array with the new items
//it is like using concat, but does not produce a new array,
//just appends it to the original which has zero items in it.
Array.prototype.push.apply(array, arr);
}
答案 2 :(得分:1)
你正在做的是创建一个新的数组,其中包含原始元素。
但是,如果你回过头来看看你传入的数组,你会注意到它没有被洗牌,而是被清空了。显然,这不是“它会洗牌吗?”请你做。
splice()和push()都会改变你调用这些方法的数组。
要回答关于.push(... arr)的问题,javascript中的elipses是使用最新版本EcmaScript 2015推出的功能。它是“传播运算符”。
当您使用“spread”数组调用函数时,就像调用函数一样,将数组的内容作为单独的参数。例如,
array.push(...[1,2,3])
与调用
相同array.push(1,2,3)
push()可以向数组添加任意数量的逗号分隔参数。因此,在使用循环拼接清空数组参数后,可以使用扩展运算符将新创建的arr的内容推送到空数组。