以固定位置洗牌数组作为例外
Shuffle Array with a fixed position as exception
我有一个输出多个id的数组。订单应该被洗牌,但第一个ID应该留在这个位置。我看过Fisher-Yates(又名Knuth) Shuffle,但我不确定如何为我的情况编辑它。
一种方法是将其拆分为两个数组。一个只有一个对象。然后用另一根柱子洗牌。洗牌之后,我将两个数组组合在一起,就像我在这个小提琴中所做的那样:https://jsfiddle.net/464fmfty/2/
// array listing post ids
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82];
var arrNew = [];
arrNew.push(arr.shift());
arr = shuffle(arr);
arrNew.push(arr);
document.body.innerHTML= arrNew;
但是我想知道是否有更好/更漂亮的方法来做到这一点?
应该像shuffle(arr, start, length)
那样调用shuffle
函数,这样代码就变得简单了。
请注意,我删除了return arr
,因为它是混乱的,当一个函数修改数组在地方和返回它。
我猜你可能会这样做
function shuffleFromOne(arr){
var i = arr.length,
j,
tmp;
while (i > 1) {
j = Math.floor(Math.random()*--i)+1;
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
return arr;
}
var arr = [1,2,3,4,5,6,7,8,9],
brr = shuffleFromOne(arr);
console.log(brr);
,
与其随机选择2个位置进行洗牌,不如选择2个大于0的位置。
var arr = [2, 11, 37, 42, 88, 234, 23, 71, 172, 82]
for (var i = 0; i < 50; i++) {
var from = Math.floor(Math.random() * (arr.length - 1)) + 1;
var to = Math.floor(Math.random() * (arr.length - 1)) + 1;
var temp = arr[from];
arr[from] = arr[to];
arr[to] = temp;
}
相关文章:
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 不能从angular2中的子组件指定父组件中的数组
- 使用JS将数组转换为json对象
- 数组在递归方法中设置为null
- knockoutjs可观察数组
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 将数组从PHP传递到Javascript
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 在函数中添加数组元素的数值
- 无法通过数组映射绑定
- javascript中的数组出错
- 如何使用 node.js 比较两个 json 数组
- 如何使用angular fullstack从$onInit()中定位构造的数组
- Javascript:使用 for 循环定位和删除数组对象
- 空数组的形式与按钮点击和动态输入定位
- 在一个对象的Javascript数组中,如果一个特定的数组元素本身就是一个对象数组,我如何通过名称/ID来定位该元素
- Vue-从数组中拼接一个已定位的元素将把它的偏移量应用到下一个索引
- 对象字面值与数组括号定位