随机排列 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]];
}
}
我有一个对象的 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]];
}
}