我有一個 X 物件陣列,"letter":"frequency"我正在嘗試從前一個由頻率乘以字母組成的 Y 陣列(對于 X ary 中的每個存在)構建一個新的 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]];
}
uj5u.com熱心網友回復:
使您的代碼不起作用的大問題是您不能直接用于for in回圈遍歷包含陣列的陣列。您沒有定義行和字母,所以我創建一個以顯示目的。
您錯過了屬性名稱,我建議您將其forEach用作替代選項。
此外, slice 不會在原始陣列上更改,它會創建一個副本,因此您應該定義另一個陣列。
slice() 方法將陣列的一部分的淺拷貝回傳到從開始到結束選擇的新陣列物件中
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]];
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/407406.html
標籤:
上一篇:將日期范圍專案的陣列拆分為每個具有開始和結束時間戳的陣列,這些時間戳可以相互重疊成單獨的非重疊范圍陣列?
下一篇:如何在JS中遞回排序
