我从GitHub得到了一个脚本,但它是随机的:https://github.com/dcbriccetti/name-picker
我尝试在static shuffle(a)中编辑picker.js。
我不想它在升序或降序或一些选项,使它不是随机的,我想自己设置它。
下面是picker.js代码:
class Picker {
constructor() {
this.speech = window.speechSynthesis;
this.utterance = new SpeechSynthesisUtterance();
this.cardSpace = [];
$('#start').click(() => {
const maxCalls = $('#max-calls').val();
const names = $('#names').val().split('\n');
this.cardSpace = [];
names.map(name => name.trim()).filter(name => name.length > 0).forEach(name => {
for (let i = 0; i < maxCalls; ++i) {
this.cardSpace.push(new NameCard(name));
}
});
Picker.shuffle(this.cardSpace);
});
$('#pick').click(() => {
this.cardSpace = this.cardSpace.filter(card => card.state === card.States.NORMAL);
if (this.cardSpace.length) {
const chosenIndex = Math.floor(Math.random() * this.cardSpace.length);
const card = this.cardSpace[chosenIndex];
card.pick();
$('#chosen').text(card.name);
if ($('#speak').prop('checked')) {
this.utterance.text = card.name;
this.speech.speak(this.utterance);
}
}
});
}
static shuffle(a) {
for (let i = a.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[a[i], a[j]] = [a[j], a[i]];
}
}
}发布于 2018-11-30 03:50:23
如果要按升序或降序排序,则需要有一个比较器函数,该函数根据一次比较两个名称返回1、0或-1。然后将其传递给数组的.sort()方法。MDN Docs on Sort
例如,您可以考虑调用this.cardSpace.sort(comparer),而不是在代码中调用Picker.shuffle(),其中comparer如下所示:
function comparer(a, b) {
var nameA = a.toUpperCase(); // ignore upper and lowercase
var nameB = b.toUpperCase(); // ignore upper and lowercase
if (nameA < nameB) {
return -1;
}
if (nameA > nameB) {
return 1;
}
// names must be equal
return 0;
}这将按升序排序(所以b在a之后)。如果要降序排序,可以将返回值乘以-1 (例如,基于变量或设置)。
发布于 2018-11-30 03:55:39
要让它按默认顺序排列,而不是随机排列,注释掉下面这行:
Picker.shuffle(this.cardSpace);要进行精细控制,只需控制项目添加到cardSpace的顺序(这就是this.cardSpace.push(new NameCard(name));行正在做的事情)。
要使其处于相反的顺序,请将该Picker.shuffle行替换为:
this.cardSpace.reverse()(参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse)
https://stackoverflow.com/questions/53546403
复制相似问题