0

オブジェクトのリストからランダムに 3 つのアイテムを選択し、それらを 1 つのフィールドでアルファベット順に並べ替え、別のフィールドの値をアルファベット順に表示するスクリプトを作成しようとしています。これまでのところ、アイテムをランダムに選択して表示することはできますが、まだソートされていません。これが私のコードです:

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());

助けてくれてありがとう。コードをクリーンアップできる方法があれば、それに関するヒントもいただければ幸いです。

4

1 に答える 1

0

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"
}

random_numbers3-これらの変数の代わりに配列を使用する必要があります。

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-これらの奇妙なチェックの代わりに、乱数が以前の乱数と異なることを確認する必要があります。小切手では、3つの乱数が同じである可能性があるため、名前は1つだけになります。

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-なぜ1つの要素(文字列)しかない配列を作成するのですか?

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(" ");

于 2012-08-30T23:12:48.613 に答える