随机化问题元素数组后,我尝试保存元素的新索引。
我使用一个名为 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
在一个步骤中获取 questionInstances
和 idMap
:
let [shuffledQuestionInstances, idMap] = tuples.reduce(
(acc, [o, i]) => [acc[0].concat([o]), acc[1].concat([i])],
[[],[]]
)
关于Javascript |随机化数组后如何保存顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40067591/