-1

ある音楽アルバムを別のアルバムと比較する関数を作成しようとしていますが、コードが実行されません。問題がどこにあり、なぜ問題があるのか​​ 本当にわからないので、その理由を知りたいです。どうもありがとう。

/********* GLOBAL VARIABLES *********/
var BR = "<br />";
var ES = " ";
/********* FUNCTIONS *********/

function compare(album[0], album[1]) {
    var sameAlbums = false;

    //There has to be an easier way to do all this...
    if (album[0].artistName === album[1].artistName && album[0].albumTitle === album[1].albumTitle && album[0].releaseYear === album[1].releaseYear && album[0].ifHQ === album[1].ifHQ && album[0].tracks[0] === album[1].tracks[0] && album[0].tracks[1] === album[1].tracks[1] && album[0].tracks[2] === album[1].tracks[2] && album[0].tracks[3] === album[1].tracks[3] && album[0].tracks[4] === album[1].tracks[4] && album[0].tracks[5] === album[1].tracks[5] && album[0].tracks[6] === album[1].tracks[6] && album[0].tracks[7] === album[1].tracks[7] && album[0].tracks[8] === album[1].tracks[8] && album[0].tracks[9] === album[1].tracks[9] && album[0].tracks[10] === album[1].tracks[10])

    {
        sameAlbums = true;
    }
    return sameAlbums;
}

/********* MAIN *********/

function main() {

    var alb = new album(2);


    for (var i = 0; i < album.length; i++) {
        album[i] = {
            artistName: "",
            albumTitle: "",
            releaseYear: 0,
            ifHQ: "",
            tracks: undefined //tracks here
        };
        album[i].artistName = prompt("What is the artist's name?");
        album[i].albumTitle = prompt("What is the album title?");
        album[i].releaseYear = parseFloat(prompt("What is the album's release year"));
        album[i].ifHQ = prompt("Is the album high quality? Y/N");

        while (!(album[i].ifHQ === "Y" || album[i].ifHQ === "N" || album[i].ifHQ === "YES" || album[i].ifHQ === "NO")) {
            album[i].ifHQ = prompt("You have entered an invalid response. Is " + album[i].title + " a ifHQ album, Y/N?");
            album[i].ifHQ = album[i].ifHQ.toUpperCase();
        }

        if (album[i].ifHQ === "Y") {
            album[i].ifHQ = true;
        }
        else {
            album[i].ifHQ = false;
        }
        album[i].tracks = new albumay(10);

        for (var j = 0 + 1; j < album[i].tracks.length; j++) {
            album[i].tracks[j] = prompt("Enter track" + (j + 1));


        }
    }
    for (var key in album[0]) {
        document.write(key + ": " + album[0][key] + " ");
        document.write(BR);
    }
    for (var key in album[1]) {
        document.write(key + ": " + album[1][key] + " ");
        document.write(BR);
    }

}

var same = compare(album[0], album[1]);
document.write(same);

// This line calls main, don't change it:
main();

編集されたコード:

<script type="text/javascript">
            /********* GLOBAL VARIABLES *********/
            var BR = "<br />";
            var ES = " ";
            var album = [];

            /********* FUNCTIONS *********/
            function compare(album1, album2)
            {
                for (var i in album1)
                {
                    if (album1[i] !== album2[i]) return false;
                }
                return true;
            }

            /********* MAIN *********/
            function main()
            {

                var album = [];
                var numAlbums = 3;

                for (var i = 0; i < numAlbums; i++) {

                    album[i] = {
                        artistName: "",
                        albumTitle: "",
                        releaseYear: 0,
                        ifHQ: "",
                        tracks: undefined //tracks here
                    };
                    album[i].artistName = prompt("What is the artist's name?");
                    album[i].albumTitle = prompt("What is the album title?");
                    album[i].releaseYear = parseFloat(prompt("What is the album's release year"));
                    album[i].ifHQ = prompt("Is the album high quality? Y/N");

                    while (!(album[i].ifHQ === "Y" || album[i].ifHQ === "N" || album[i].ifHQ === "YES" || album[i].ifHQ === "NO"))
                    {
                        album[i].ifHQ = prompt("You have entered an invalid response. Is " + album[i].title + " a ifHQ album, Y/N?");
                        album[i].ifHQ = album[i].ifHQ.toUpperCase();
                    }

                    if (album[i].ifHQ === "Y")
                    {
                        album[i].ifHQ = true;
                    }
                    else
                    {
                        album[i].ifHQ = false;
                    }
                    album[i].tracks = new album(10);

                    for (var j = 0 + 1; j < album[i].tracks.length; j++)
                    {
                        album[i].tracks[j] = prompt("Enter track" + (j + 1));


                    }
                }
                for (var key in album[1])
                {
                    document.write(key + ": " + album[1][key] + " ");
                    document.write(BR);
                }
                for (var key in album[2])
                {
                    document.write(key + ": " + album[2][key] + " ");
                    document.write(BR);
                }
            }

            var same = compare(album1, album2);
            document.write(same);

            // This line calls main, don't change it:
            main();
        </script>
4

2 に答える 2

0

コードでデバッガーを実行すると、問題がcompare関数にあることがわかります。特に、引数名に角かっこを含めることはできません。

したがって、比較関数を変更することをお勧めします。

function compare (album1, album2) {
    for (var i in album1) {
        if (album1[i] !== album2[i]) return false;
    }
    return true;
}
于 2012-12-31T01:30:28.477 に答える
0

あなたのアップデートに基づいて

このコードにはまだ多くの問題があります。

まず最も重要なことは、album1 と album2 が比較される前に定義されていないことです。これには 2 つの理由があります。

  1. Main() は実行後まで実行されないため、album[] は定義されていません
  2. アルバム[1]はアルバム1と同じではありません

さらに考慮すべき点がいくつかあります。

  1. JavaScript では、配列のインデックスは 0 から始まります。配列を 1 から開始するために最初のインデックスをスキップすることは、悪い習慣と見なされます。
  2. 現在行っている 24 のプロンプトの代わりに、おそらく入力用のフォームを検討する必要があります。24 プロンプトが連続して表示されるのは、ユーザーにとって非常に煩わしいものです。
  3. おそらく、HQ 検証用のモーダル ウィンドウが必要です。このようなもの

コードのクリーンアップの試み

ここでの選択のいくつかを再考する必要があると思いますが、少なくとも実行されるクリーンアップされたバージョンのコードを次に示します。

jsfiddle

<script type="text/javascript">

    /********* FUNCTIONS *********/
    function compare(album1, album2)
    {
        for (var i in album1)
        {
            if (album1[i] !== album2[i]) return false;
        }
        return true;
    }

    /********* MAIN *********/
    function main()
    {

        var album = [];
        var numAlbums = 2;

        for (var i = 0; i < numAlbums; i++) {

            album[i] = {};
            album[i].artistName = prompt("What is the artist's name?");
            album[i].albumTitle = prompt("What is the album title?");
            album[i].releaseYear = parseFloat(prompt("What is the album's release year"));
            var hq = prompt("Is the album high quality? Y/N")
            if(!hq)
            {
                hq = "";
            }

            while (true)
            {
                hq = hq.toUpperCase();
                if( hq==="Y" || hq === "YES" )
                {
                    album[i].ifHQ = true;
                    break;
                }
                else if( hq ==="N" || hq === "NO" )
                {
                    album[i].ifHQ = false;
                    break;
                }
                else
                {
                hq = prompt(
                    "You have entered an invalid response. Is " + 
                    album[i].title + " a ifHQ album, Y/N?");
                }
            }
            album[i].tracks = [];

            for (var j = 0; j < 10; j++)
            {
                album[i].tracks[j] = prompt("Enter track" + (j + 1));
            }
        }

        var same = compare(album[0], album[1]);
        document.write(same);
    }
    // This line calls main, don't change it:
    main();
</script>
于 2012-12-31T01:50:07.910 に答える