2016-04-24 2 views
0

配列内のプロトタイプ関数を使用してスコープの問題の周りに脳をラッピングする際に問題が発生しています。私はそれを静的な項目で動作させることができますが、配列で作業するために一般化しようとすると、 "関数ではありません"というエラーが表示されます。ここにコードの私の現在の演出があります。どんな助けもありがとう。配列のソート中にプロトタイプ関数にアクセスしますか?

function Automobile(year, make, model, type) { 
    this.year = year; //integer (ex. 2001, 1995) 
    this.make = make; //string (ex. Honda, Ford) 
    this.model = model; //string (ex. Accord, Focus) 
    this.type = type; //string (ex. Pickup, SUV) 

} 
Automobile.prototype.logMe = function(bool) { 

    console.log("Working"); //testing function 
    if (bool == true) { 
     console.log(this); 
    } 

}; 

/*Sample Array*/ 
var automobiles = [ 
    new Automobile(1995, "Honda", "Accord", "Sedan"), 
    new Automobile(1990, "Ford", "F-150", "Pickup"), 
    new Automobile(2000, "GMC", "Tahoe", "SUV"), 
    new Automobile(2010, "Toyota", "Tacoma", "Pickup"), 
    new Automobile(2005, "Lotus", "Elise", "Roadster"), 
    new Automobile(2008, "Subaru", "Outback", "Wagon") 
]; 

/*This function sorts arrays using an arbitrary comparator.*/ 
function sortArr(comparator, array) { 


    array.sort(function(a, b) { 
     return comparator(a, b); 
    }); 
    return array; 
} 

function exComparator(int1, int2) { 
    if (int1 > int2) { 
     return true; 
    } else { 
     return false; 
    } 
} 


function yearComparator(auto1, auto2) { 
    return exComparator(auto1.year, auto2.year); 
} 

/* Output*/ 
console.log("*****"); 
console.log("The cars sorted by year are:"); 
forEach(sortArr(yearComparator, automobiles), automobiles.logMe(true)); //This is not right! 


function forEach(array, doStuff) { 
    for (var i = 0; i < array.length; i++) 
     doStuff(array[i]); 
} 
+2

ソートコンパレータ関数は 'true'または' false'を返すものではありません。代わりに、負の数、ゼロ、または正の数を返して、最初の値が前の値になるか、同じであるか、または2番目の値が最初の値よりも前になる必要があることを示します。 – Pointy

+2

また、あなたの 'sortArr'関数は' array.sort(comparator) 'と機能的に同じです – Alnitak

+0

[あなたの比較関数は無効です](http://stackoverflow.com/q/24080785/1048572)、それはあなたの問題ではありません'forEach'で持っています。 – Bergi

答えて

1

ご報告された問題は、(あなたのソートコンパレータ機能も無効ですが - 下記参照)ソートを行うには全く何の関係もありません。

あなたの代わりにその関数への参照のごforEach機能にautomobiles.logMe結果を渡しているので、あなたが取得しているエラーです。いずれにせよ、そのlogMe関数は共有インスタンスメソッドであり、配列を経由することはできません。

あなたのソート機能も不要である - あなたの全体のソート/表示ループを書き込むことができます。

automobiles.sort(yearComparator).forEach(function(auto) { 
    auto.logMe(true); 
}); 

をしてからちょうど標準ES5の機能を複製不要なsortArrforEach機能を取り除きます。

コンパレータを固定するには、false/trueではなく、(-ve、0、+ ve)のいずれかを返す必要があります。それはちょうど2つの数の差を返すようにすれば良い数値比較のために:

function yearComparator(auto1, auto2) { 
    return auto1.year - auto2.year; 
} 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

+0

私はあなたが何を意味しているのか、そしてすべてが魅力のように働くことを確かに見ます。残念ながら、私はsortArr関数の使用を必要とするいくつかの割り当て要件を満たそうとしており、真/偽のコンパレータを教えてくれました。先週のJavascriptを開始して以来、私が話していることを知っているとは言い難いです。 – Derkus

+0

この場合、 'sortArr'関数は、' comparator 'を2回呼び出す必要があり、a> b、b> aのいずれかであるかどうかに基づいて正しい-ve、0、+ veの結果を返す必要があります。実際の問題は、 'automobiles.logMe(true)'を 'forEach'関数に渡そうとした方法にのみ関連しています。 – Alnitak

+0

甘い、私はそれがすべて今働いている。あなたの助けにお返事ありがとうございます。私はあなたの入力をsortArr関数にパッケージ化し、提供されたコンパレータを書き直し、さらに混乱させるだけの不必要なコードの巨大な山を削除しました。それは今動作し、はるかにきれいです。 – Derkus

0

主な問題は、「automobiles.logMe(真)」です。 automobilesはAutomobileオブジェクトの配列です。配列自動車の各要素は、プロトタイプの関数logMe()にアクセスできますが、配列自体はアクセスできません。

また、doStuff(array [i])は、3つの重要な関数(呼び出し、適用、バインド)の詳細を学習する必要があることを示しています。この記事を少し見てみると、http://javascriptissexy.com/javascript-apply-call-and-bind-methods-are-essential-for-javascript-professionals/

+0

チップをありがとう! Dang right私はこれらの機能についてもっと知る必要があります。リンクありがとう。 – Derkus

+0

私はここで '.call'や' .apply'の使用に同意しません(そして '.bind'は確かに関係ありません)。標準のES5 'Array.prototype.forEach'は、各繰り返しで' this'を個別に設定することをサポートしていません - 必要に応じて、これを行うために提供されたコールバックに依存します。しかし、_every_繰り返しの共通のコンテキストを設定することはできません。 – Alnitak

+0

私はそのコードを使用していませんでしたが、私がもっと知る必要がある機能は間違いありませんので、リンクは非常に便利です。 – Derkus

関連する問題