2016-11-13 3 views
0

JavaScriptの関数型プログラミングについては、クールなオンラインコースを受講しています。インストラクターがArray.prototype.reject()を使用し、実行時に私のためにうまくいかなくなるまで、私はちょうどうまくいきました。Array.prototype.reject():TypeError:.... rejectは関数ではありません

forループの代わりに "reject"を使用したいのは、コードが少ないからです。しかし、私のブラウザであるNodeJSとExpressコードのコンソールは、私にはreject is not a functionと言っています。

私は、promise.rejectについて議論した他の記事を調査しましたが、機能ではありませんが、私のシナリオには意味をなさないソリューションを提供しています。ここで

は例のコードはもちろんである:

var animals = [ 
    { name: 'Fluffykins', species: 'rabbit' }, 
    { name: 'Caro',   species: 'dog' }, 
    { name: 'Hamilton',  species: 'dog' }, 
    { name: 'Harold',  species: 'fish' }, 
    { name: 'Ursula',  species: 'cat' }, 
    { name: 'Jimmy',  species: 'fish' } 
]; 


var isDog = function(animal){ 
    return animal.species === 'dog'; 
} 

var otherAnimals = animals.reject(isDog); 

作業アラウンド用ループ付き:

var notDogs = animals.filter(function(animal){ 
    return animal.species !== 'dog'; 
}); 

は、その出力は次のようになります。

> notDogs 
[ { name: 'Fluffykins', species: 'rabbit' }, 
    { name: 'Harold', species: 'fish' }, 
    { name: 'Ursula', species: 'cat' }, 
    { name: 'Jimmy', species: 'fish' } ] 

助けてください私はArray.prototype.reject()を使用します。

EditL

私は

+0

あなたのJSバージョンは何ですか?おそらく[拒否はサポートされていません](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject#Specifications) – mplungjan

+3

さて、配列には '.reject'メソッドが主にそれらが約束ではないので、私はあなたがなぜそのコードが動作することを期待しているのか分かりません。 – vlaz

+0

あなたの質問は明確ではありません。 'reduce'を使ってこの問題を解決したいですか? – zhuscat

答えて

3

Array.prototype.rejectGitHub /Array.prototype.rejectでArray.prototype.rejectを()が見つかりライブラリ/カスタムコードは、配列にreject方法を追加しない限りものではありません。

希望するものを達成するには、すでにあるようにArray.prototype.filterメソッドを使用する必要があります。

var animals = [ 
 
    { name: 'Fluffykins', species: 'rabbit' }, 
 
    { name: 'Caro', species: 'dog' }, 
 
    { name: 'Jimmy', species: 'fish' } 
 
]; 
 

 
function noDogs(animal) { 
 
    return animal.species !== 'dog'; 
 
} 
 

 
var otherAnimals = animals.filter(noDogs); 
 
console.log(otherAnimals);

0

あなたはlodash/underscore

_.rejectを見つけることができ、私はあなたと思う:私はあなたがそれを同じように書くことができますので、あなたが長く、それについてだと思うかわからないんだけどArray.prototype.reduceを問題なく使用できますが、ここではreducerejectの間で混合していることがあります。

rejectは、拒否された要素を持たない配列をfilterと反対に生成します。

function even(number) { 
    return number % 2 === 0; 
} 

_.reject([1, 2, 3, 4], even); // [1, 3] 
_.filter([1, 2, 3, 4], even); // [2, 4] 

// reduce is totally different method 
_.reduce([1, 2, 3, 4], function(total, current) { 
    return total + current; 
}, 0); // 10 
+1

Array.prototype.reduce()が問題ではないと言ったとき、私は[GitHub](https://github.com/thejameskyle/Array.prototype.reject)をチェックアウトして見つけました。私のためにそれを分解していただきありがとうございます。 Reduceは私の一種でした。謝罪いたします。 –

+0

ちょっと男、減らすことです。拒絶はない。あなたは両方のものを区別する必要があります。 re(duce) - re(ject) –

0

Array.prototype.rejectはバニラはJavaScriptに存在しません:

reduceは、項目のリストから

例を全く新しい項目の値を生成します。

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

あなたがfunfunfunctionによって提供された例を使用していたようです: https://www.youtube.com/watch?v=BMUiFMZr7vk

、彼が実際に彼はこのビデオで示すコードのいずれかを実行しません注意してください。

Dymosが示唆しているように、拒否はlodash/underscoreに存在するか、同じ結果をfilterを使用して導出することができます。

0

速いのため&汚い仕事!

Array.prototype.reject = function(fn) { 
let rej = test => !fn(test); 
return this.filter(rej); 
}; 
関連する問題