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

时间:2016-10-16 06:36:01

标签: 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;
    }

  }

2 个答案:

答案 0 :(得分:1)

让我们首先映射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])

加分:您可以使用questionInstances一步获得idMapreduce

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

答案 1 :(得分:0)

您可以使用作用域哈希表,假设问题实例具有唯一ID。

// update this as needed
var hash = {
    //id: order
};