随机化一组问题元素后,我试图保存元素的新索引。
我使用名为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;
}
}
答案 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
一步获得idMap
和reduce
:
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
};