Javascript |随机化数组后如何保存顺序

标签 javascript arrays

随机化问题元素数组后,我尝试保存元素的新索引。

我使用一个名为 idMap 的数组来实现此目的。它将原始索引保存在第一个 for 循环中,然后在问题元素数组被打乱后更新索引。

是否有更好的方法来执行此操作,而不将订单保存为问题的属性 (questionInstances[i].originalOrder),因为它可能会被覆盖?

  // Save the original order of array
  for (var i = 0; i < questionInstances.length; i++) {
    questionInstances[i].originalOrder = i;
    idMap[i] = i;
  }

  // Randomize array

  if (params.randomQuestions) {

    questionInstances = H5P.shuffleArray(questionInstances);

    // Save new randomized order
    for (var i = 0; i < questionInstances.length; i++) {
      idMap[i] = questionInstances[i].originalOrder;
    }

  }

最佳答案

让我们首先将 questionInstances 映射到一个新的元组数组(它们的第一个元素是数组中的原始项目,第二个元素是其索引):

let questionInstances = ["a", "b", "c", "d", "e"] // for example

let tuples = questionInstances.map((o, i) => ([o, i]))

该数组中的项目是:

[["a", 0], ["b", 1], ["c", 2], ["d", 3], ["e", 4]]

我们将原始的 questionInstances 映射到一个新数组(其中包含它们的索引),而不修改(变异)其元素。

现在打乱这个数组:

tuples = H5P.shuffleArray(tuples)

现在打乱后的 questionInstances 数组是:

questionInstances = tuples.map(d => d[0])

和索引图:

let idMap = tuples.map(d => d[1])

奖励:您可以使用 reduce 在一个步骤中获取 questionInstancesidMap:

let [shuffledQuestionInstances, idMap] = tuples.reduce(
    (acc, [o, i]) => [acc[0].concat([o]), acc[1].concat([i])], 
    [[],[]]
  )

关于Javascript |随机化数组后如何保存顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40067591/

相关文章:

MYSQL JSON select查询每次运行返回不同的结果

Char* 字符数组,但 int* 不是整数数组?

javascript - 给定两个相同长度的数组,找到哪些元素是 "shifted"

javascript - Jquery FadeIn 添加显示属性而不是仅仅删除显示 :none

javascript - 为什么 javaScript 中的字符串赋值不区分大小写?

Javascript:无法获得 Promises.all 响应

ruby - 如何拒绝基于并行数组的一个数组的值?

javascript - 使用JS检测文本框何时有值和单选按钮列表何时有选定索引

javascript - 错误 - 在处理程序中创建了一个 promise ,但没有从中返回

ios - 如何使用对象映射器 Swift 映射字典数组