我正在使用简单的lamda函数来返回数组,但我需要对它进行洗牌,所以每次它都会正确地改变序列。
dynamodb.scan(params, function(err, data) {
if(err){
console.log(err);
callback(err);
}
else{
console.log(data);
const items = data.Items.map(
(dataField) => {
return {
rather:dataField.Rather.S,
would:dataField.Would.S,
wouldClick:+dataField.wouldClick.N,
ratherClick:+dataField.ratherClick.N,
QuestionID:dataField.QuestionID.S,
};
}
);
callback(null, items);
}
});
正如你在回调网站上看到的返回项目,我需要洗牌这个项目,所以每次序列将不一样,它将正确地洗牌。
项目的格式是这样的
[
{
"rather": "asd",
"would": "dsa",
"wouldClick": 4,
"ratherClick": 2,
"QuestionID": "f70da742-6731-48f4-84aa-a15c68e26cdf"
},
{
"rather": "asda",
"would": "ssam",
"wouldClick": 4,
"ratherClick": 1,
"QuestionID": "de23902c-87ef-4a80-afd7-2f9b5bb0724d"
},
{
"rather": "sada",
"would": "asdk",
"wouldClick": 2,
"ratherClick": 3,
"QuestionID": "7d57a847-b7e6-4e87-a9a4-abfe2a2d85ad"
}
]
这样工作
const shuffleitems = shuffle(items);
callback(null, shuffleitems);
function shuffle(array) {
var currentIndex = array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
明显但不正确的方法
你可以用这种方式实现随机排序
const aa = [1,2,3,4,5,6,7,8]
const sortedRandomly = aa.sort(() => Math.random() - .5)
在您的情况下,请尝试实现这样的代码
const items = data.Items.map(
(dataField) => {
return {
rather:dataField.Rather.S,
would:dataField.Would.S,
wouldClick:+dataField.wouldClick.N,
ratherClick:+dataField.ratherClick.N,
QuestionID:dataField.QuestionID.S,
};
}
).sort(() => Math.random() - .5);
这种方法简单而明显,但它是不正确的,因为它不能产生均匀分布,你可以找到详细的信息。此处.
正确的实施方式
更好的方法是实施 Fisher-Yates洗牌算法. 用javascript实现的例子。
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
}
所以作者的案子可以用这种方式解决。
const items = shuffle(data.Items.map(...));