首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按降序排序

按降序排序
EN

Stack Overflow用户
提问于 2018-11-30 03:41:23
回答 2查看 86关注 0票数 0

我从GitHub得到了一个脚本,但它是随机的:https://github.com/dcbriccetti/name-picker

我尝试在static shuffle(a)中编辑picker.js。

我不想它在升序或降序或一些选项,使它不是随机的,我想自己设置它。

下面是picker.js代码:

代码语言:javascript
复制
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]];
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2018-11-30 03:50:23

如果要按升序或降序排序,则需要有一个比较器函数,该函数根据一次比较两个名称返回1、0或-1。然后将其传递给数组的.sort()方法。MDN Docs on Sort

例如,您可以考虑调用this.cardSpace.sort(comparer),而不是在代码中调用Picker.shuffle(),其中comparer如下所示:

代码语言:javascript
复制
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 (例如,基于变量或设置)。

票数 0
EN

Stack Overflow用户

发布于 2018-11-30 03:55:39

要让它按默认顺序排列,而不是随机排列,注释掉下面这行:

代码语言:javascript
复制
 Picker.shuffle(this.cardSpace);

要进行精细控制,只需控制项目添加到cardSpace的顺序(这就是this.cardSpace.push(new NameCard(name));行正在做的事情)。

要使其处于相反的顺序,请将该Picker.shuffle行替换为:

代码语言:javascript
复制
 this.cardSpace.reverse()

(参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53546403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档