我试图在一个数组中对多个数组进行排序(也必须对其进行洗牌).一个简单的例子是:

let toShuffle = [
[1, 2, 3, 4, 5],
[9, 8, 7, 6, 5],
[10, 67, 19 ,27]
...
];

const shuffled = shuffle(toShuffle);

// outout would look something like:
// [
//   [8, 6, 5, 7, 9],
//   [4, 3, 1, 5, 2],
//   [19, 26, 10, 67],
//   ...
// ]

这需要灵活,所以任何数量的数组和任何数量的值都应该是有效的.

以下是我try 过的:

function shuffle(a) {
  for (let e in a) {
    if (Array.isArray(a[e])) {
      a[e] = shuffle(a[e]);
    } else {
      a.splice(e, 1);
      a.splice(Math.floor(Math.random() * a.length), 0, a[e]);
    }
  }

  return a;
}

console.log("Shuffled: " + shuffle([
  [1, 2, 3, 4, 5],
  [5, 4, 3, 2, 1]
]))

但它没有按预期工作.他们的方法更简单吗?或者我的代码是正确的,只是有问题.

推荐答案

您可以使用Array.from()创建一个新的浅复制array,然后将Array.prototype.sort()Math.random()组合在一起进行混洗

代码:

const toShuffle = [
  [1, 2, 3, 4, 5],
  [9, 8, 7, 6, 5],
  [10, 67, 19 ,27]
]

const shuffle = a => Array.from(a).sort(() => .5 - Math.random())
const result = toShuffle.map(shuffle)

console.log('Shuffled:', JSON.stringify(result))
console.log('To shuffle:', JSON.stringify(toShuffle))

Javascript相关问答推荐

在grafana情节,避免冲突的情节和传说

如何添加绘图条形图图例单击角形事件

如何从隐藏/显示中删除其中一个点击?

如何从Intl.DateTimeFormat中仅获取时区名称?

我在我的Java代码中遇到了问题,代码的一部分看不到先前定义的对象

保持物品顺序的可变大小物品分配到平衡组的算法

可更改语言的搜索栏

如何发送从REST Api收到的PNG数据响应

Jest toHaveBeenNthCalledWith返回当前设置的变量值,而不是调用时的值

TypeError:无法读取未定义的属性(正在读取';宽度';)

如何使用Astro优化大图像?

通过解构/功能组件接收props-prop验证中缺少错误"

React数组查找不读取变量

在一次操作中使用多个addToSet不适用于多个数组

FiRestore按字段的提取顺序

JavaScript原型排序函数不会与所有成员进行比较

使用可重用组件组织Reaction项目的最佳方式是什么

从Java到Java的Port Inn代码验证

错误403 Spotify API:ERR_ABORTED 403(禁止)

从添加的袋子中删除产品在Redux-Toolkit中不起作用