如何在LAMDA Nodejs中对数组进行洗牌?

问题描述 投票:0回答:1

我正在使用简单的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;
}
node.js amazon-lamda
1个回答
1
投票

明显但不正确的方法

你可以用这种方式实现随机排序

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(...));
© www.soinside.com 2019 - 2024. All rights reserved.