随机排列 N 个字母的数组并取出其中的 M 个

Shuffle array of N letters and take M of them

我有一个对象的 X 数组 "letter":"frequency",我正在尝试从前一个由频率-时间字母(对于 X 数组中存在的每个字母)组成的 Y 数组构建一个新的 Y 数组。然后我的目的是洗牌 Y ary 并只从中取出 z-first 元素。 n 是传递给函数的参数

exports.listLetters = (n) => {
return new Promise((resolve, reject) => {
    const sql = 'SELECT * FROM letters';
    db.all(sql, [], (err, rows) => {
        if (err) {
            reject(err);
            return;
        }
        if (rows == undefined) {
            resolve({ error: "Errors with retrieving letters. " })
        } else {

            const letters = rows.map((e) => ({ letter: e.letter, frequency: e.frequency }));const letters = rows.map((e) => ({ letter: e.letter, frequency: e.frequency }));
            let freqLetters = [];
            for (let letter in letters) {
                for (let i = 0; i <= letter.frequency * 100; i++) {
                    freqLetters.push(letter);
                }
            };

            shuffleArray(freqLetters);
            freqLetters.slice(0, n);

            resolve(freqLetters);

为什么这个算法不起作用? 随机播放功能为:

function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
}

使您的代码无法运行的最大问题是您不能直接使用 for in 循环遍历包含数组的数组。您没有定义行和字母,所以我创建一个用于显示目的。

您错过了 属性 名称,我建议您使用 forEach 作为替代选项。

此外,slice 不会改变原始数组,它会创建一个副本,因此您应该定义另一个数组。

The slice() method returns a shallow copy of a portion of an array into a new array object selected from start to end

let rows = [{
    letter: 'word',
    frequency: 5
  },
  {
    letter: 'yes',
    frequency: 4
  },
  {
    letter: 'no',
    frequency: 3
  }
]
let n = 10
const letters = rows.map((e) => ({
  letter: e.letter,
  frequency: e.frequency
}));

let freqLetters = [];

letters.forEach(function(arr) {
  for (let i = 0; i <= arr.frequency * 100; i++)
    freqLetters.push(arr.letter);


})

shuffleArray(freqLetters);
let finalarray = freqLetters.slice(0, n)
console.log(finalarray)
function shuffleArray(array) {
  for (let i = array.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }
}