web-dev-qa-db-ja.com

Undefinedはオブジェクトではありません(myArray.lengthを評価しています)

私は、クイックソートアルゴリズムを使用して数値の配列をソートするプログラムに取り組んできました。これは私のコードです:

    var myArray=[8,2,5,6];

function quickSort(myArray)
{
    if (myArray.length === 0){
        return [];
    }

    var left=[];
    var right=[];
    var pivot= myArray[0];

    for (var i=1; i<myArray.length; i++){

        if (myArray[i]<pivot) {
            left.Push(myArray[i]);

        }

        else {

            right.Push(myArray[i]);
        }
    }

    return quickSort(left).concat(pivot, quickSort(right));
    document.getElementById().innerHTML = quickSort(left).concat(pivot, quickSort(right));
}

そして、これが私のhtmlです

<html>
<h1>QuickSorter</h1>
<button onclick="quicksort()">Quick Sort It!</button>
<script src="quicksort.js"> </script>
</html>

サファリのコンソールは私にこれを表示し続けます:

TypeError: undefined is not an object (evaluating myArray.length)

なぜそれが機能しないのか、私は本当にまったく理解していません。どんな助けでもいただければ幸いです。

4
Joshua Reddy

で関数を呼び出す場合

quicksort()

引数を渡していない。ただし、関数はで始まる

function quickSort(myArray)
{
  if (myArray.length === 0){
    return [];
  }

引数がquicksortに渡されないため、myArrayは未定義のままになります。未定義の変数はオブジェクトではないため、lengthなどのプロパティを持つことはできません。

編集:

ボタンをクリックしたときに関数を呼び出すには、イベントリスナーをHTMLに配置するのではなく、JavaScriptで設定することをお勧めします。

ボタンにID名を付けて、onclick属性を削除します。

<button id="sortButton">Quick Sort It!</button>

次に、JavaScriptでquickSort定義の後にイベントリスナーを追加します。

document.getElementById("sortButton").onclick = function(){quickSort(myArray);});
6
Warren R.

HTMLonclickの関数にパラメータを渡さないでください。したがって、myArrayは最終的にfunc内で未定義になります。関数の外部で定義されたmyArrayは、関数のパラメーターとして定義された内部のmyArrayとは異なることに注意してください。

3
user2717954

これがここで役立つかどうかはわかりませんが、document.getElementsByClassNameはスタイルを返しません。

したがって、クラス名を介して要素にアクセスしている間は、質問で述べたのと同じエラーが発生します。

私のプロジェクトの以下のコード。

document.getElementById("profile-main-div").style.display=="none".  //Working
document.getElementsByClassName("profile-main-div").style.display=="none".  //Not Working
0
user9359064