繁体   English   中英

Javascript从数组中选择随机数并按字母顺序排列

[英]Javascript to choose random from array and alphabetize

我正在尝试编写一个脚本,该脚本从对象列表中随机选择三个项目,然后按一个字段将其按字母顺序排列,然后显示另一个字段的按字母顺序排列的值。 到目前为止,我可以让它随机选择项目并显示它们,但是仍然没有排序。 这是我的代码:

function random_text() {};
var random_text = new random_text();
var number = 0;
random_text[number++] = {
    show: "Bob",
    sort: "A"
}
random_text[number++] = {
    show: "Casey",
    sort: "B"
}
random_text[number++] = {
    show: "Dan",
    sort: "C"
}
random_text[number++] = {
    show: "Alfred",
    sort: "D"
}

var random_number = Math.floor(Math.random() * number);
var random_number1 = Math.floor(Math.random() * number);
var random_number2 = Math.floor(Math.random() * number);

if (random_number !== random_number1) {
    var name1 = random_text[random_number1].show;
} else {
    var name1 = "";
}

if (random_number !== random_number2 && random_number1 !== random_number2) {
    var name2 = random_text[random_number2].show;
} else {
    var name2 = "";
}

var name3 = random_text[random_number].show;

var objs = [name1 + " " + name2 + " " + name3];

objs.sort(function (a, b) {
    var nameA = a.sort.toLowerCase(),
        nameB = b.sort.toLowerCase()
        if (nameA < nameB) //sort string ascending
    return -1
    if (nameA > nameB) return 1
    return 0 //default return value (no sorting)
})

document.write(objs.sort());

先谢谢您的帮助。 如果有什么办法可以清除代码,我很欣赏上的提示了。

参见http://jsfiddle.net/Nc2Je/

var random_text = [
    {
        show: "Bob",
        sort: "A"
    },
    {
        show: "Casey",
        sort: "B"
    },
    {
        show: "Dan",
        sort: "C"
    },
    {
        show: "Alfred",
        sort: "D"
    }
],random_numbers = new Array(),
    objs=new Array();
for(var i=0;i<3;i++){
    function random(){
        var n=Math.floor(Math.random() * random_text.length);
        if(random_numbers.indexOf(n)===-1){return n;}
        return random();
    }
    random_numbers.push(random());
    objs.push(random_text[random_numbers[i]])
}
var alphabetized=new Array();
outerloop:
for(var i=0;i<objs.length;i++){
    for(var j=0;j<alphabetized.length;j++){
        if(alphabetized[j].sort>objs[i].sort){
            alphabetized.splice(j,0,objs[i]);
            continue outerloop;
        }
    }
    alphabetized.push(objs[i]);
}
alphabetized.getNames=function () {
    var arr=new Array();
    for(var i=0;i<this.length;i++){
        arr.push(this[i].show);
    }
    return arr;
}

document.write(alphabetized.getNames());

编辑:

您做了一些奇怪的事情:

1-为什么要创建一个空函数,然后用其自身的实例覆盖它?

function random_text() {};
var random_text = new random_text();

2-如果您想要一个像数组一样工作的对象,为什么不使用数组而不是将类似于数组的属性设置为random_text呢?

var number = 0;
random_text[number++] = {
    show: "Bob",
    sort: "A"
}
random_text[number++] = {
    show: "Casey",
    sort: "B"
}
random_text[number++] = {
    show: "Dan",
    sort: "C"
}
random_text[number++] = {
    show: "Alfred",
    sort: "D"
}

3-您应该使用数组random_numbers而不是这些变量:

var random_number = Math.floor(Math.random() * number);
var random_number1 = Math.floor(Math.random() * number);
var random_number2 = Math.floor(Math.random() * number);

4-而不是那些奇怪的检查,您应该确保您的随机数与以前的随机数不同。 进行检查时,三个随机数可能相同,因此您只有一个名字。

if (random_number !== random_number1) {
    var name1 = random_text[random_number1].show;
} else {
    var name1 = "";
}

if (random_number !== random_number2 && random_number1 !== random_number2) {
    var name2 = random_text[random_number2].show;
} else {
    var name2 = "";
}

var name3 = random_text[random_number].show;

5-为什么创建一个只有一个元素(一个字符串)的数组?

var objs = [name1 + " " + name2 + " " + name3];

6-我没有使用您的以下代码,因为我从未使用过它,所以我编写了自己的排序函数。

objs.sort(function (a, b) {
    var nameA = a.sort.toLowerCase(),
        nameB = b.sort.toLowerCase()
        if (nameA < nameB) //sort string ascending
    return -1
    if (nameA > nameB) return 1
    return 0 //default return value (no sorting)
})

7-对对象进行排序后,如果要编写对象,则应使用document.write(objs)而不使用sort()

编辑2:

alphabetized.getNames返回一个数组。

这样你可以做

var names=alphabetized.getNames();
names.length;
names[0];
...

而且,如果您想要一个字符串,则可以执行alphabetized.getNames().join(" ");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM