降序排列

时间:2018-11-29 19:41:23

标签: javascript

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

我尝试在静态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]];
        }
    }
}

2 个答案:

答案 0 :(得分:0)

如果要升序或降序排序,则需要具有一个比较器函数,该函数根据一次比较两个名称返回1、0或-1。然后,将其提供给数组的Sub Dump(topLeftCell As Range, sCaption$, wordcnt#, cnt#, Optional is_divide = False) topLeftCell.Resize(, 3) = Array(sCaption, cnt, Round(wordcnt / (cnt / IIf(is_divide, 2, 1)), 2)) End Sub Sub Test() Call Dump([A1], "Commas", 100, 50) End Sub 方法。 MDN Docs on Sort

例如,您可以考虑在比较器如下所示的情况下考虑调用.sort(),而不是在代码中调用Picker.shuffle()

this.cardSpace.sort(comparer)

那将升序排列(所以b在a之后)。如果要对降序进行排序,则可以将返回值乘以-1(例如,基于变量或设置)。

答案 1 :(得分:0)

要以默认顺序(而不是随机的)将其注释掉,请将该行注释掉:

 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