2017-03-24 9 views
0

何度も私は同じ質問をします... JSでかなり直接的なコードを書くためのすべての構文(必ずしも直感的ではない)を使って、私は疑問を抱いていました。そのような操作のためのライナー? 、私は私に提案されたかについてのフィードバックを与えるためにentries.mapTypescript/Javascriptは1つのライナーを割り当てて返します


の引数として直接読み込み可能な形で置くことができると、プロパティを割り当てて、ワンショットでオブジェクトを返す

var setFeatured = entry => { 
    entry.isFeatured = true; 
    return entry 
} 

SomeCallThatReturnsAPromise.then(entries => entries.map(setFeatured)) 

:一般的な答えは(OR後の部分をトリガする undefinednullfalsenever、よく何かを返す)逢引や関数呼び出しの後、OR演算子で結果を返すようにしました0

return entry.isFeatured = true || entry

私の質問の関心は、私はよりコンパクトな構文の利点を取ることができるかどうかを知ることだった:

SomeCallThatReturnsAPromise 
    .then((entries:EntryType[]) => entries 
     .map(entry => { 
      entry.isFeatured = true; 
      return entry; 
     }) 
     .filter(entry => entry.something == true))        
    .then((entries:EntryType[]) => { 
      someCallThatReturnsNothingButHasToBeDoneThere(); 
      return entries; 
     }) 
    .then((entries:EntryType[]) => console.log(entries)) 

注:

SomeCallThatReturnsAPromise() 
    .then((entries:EntryType[]) => entries 
     .map(entry => entry.isFeatured = true || entry) 
     .filter(entry => entry.something == true)) 
    .then((entries:EntryType[]) => someCallThatReturnsNothingButHasToBeDoneThere() || entries) 
    .then((entries:EntryType[]) => console.log(entries)) 

は、より読みやすくなります

1)私はそのための関数を作成しないようにしています。私の質問は好奇心によって動機づけられ、Vanilla ES6または7の構文が提供しなければならないことのみに関心があります。

2).mapではなく.forEachと回答しました。私は機能的なアプローチ(つまり、コンパクトコールバックの重要性)で自分のコードを設計するので、.forEachは必ずしも良い選択ではありません(そして明らかに、パフォーマンスやメモリ消費の面でメリットがありません)。 1行の構文は、約束コールバックまたは配列関数のチェーンを処理するときに便利です。

3)OR演算子を使用するときに返される型は、EntryType|nullです。だから、後続の呼び出しのためのタイピングを中断し、型アサーションを意味します

重くなってきた
SomeCallThatReturnsAPromise() 
    .then((entries:EntryType[]) => entries 
     .map(entry => (entry.isFeatured = true || entry) as EntryType) 
     .filter(entry => entry.something == true)) 
    .then((entries:EntryType[]) => (someCallThatReturnsNothingButHasToBeDoneThere() || entries) as EntryType[]) 
    .then((entries:EntryType[]) => console.log(entries)) 

私はそれを使用するか、return文を含む二行に固執するだろうならば...私はまだ知りません。

4)これは縮小された例です。最初のthenに同期呼び出しが含まれていること、または私の例がより正確であることがわかっています。

+2

正確に同じアイテムを返す場合、 'map'を使用することは意味がありません。 –

+0

ああ。 'forEach'をどのように使って' entries 'を返すのか、私の答えを見てください。 –

+0

はい、それはもはや1ライナーではありません:) – arvymetal

答えて

5
entries.forEach((entry) => entry.isFeatured = true); 

機能を別途定義する必要はありません。

さらに、要素がオブジェクトで参照として処理されるため、map()forEach()に置き換えることができ、値を返す必要がなくなります。 @Sirkoが正しいと、その特定の場合には、forEachは私がmapを使用するよりもより多くの意味を持っているものの

+0

forEachについて、私の電話は約束(私の投稿を編集)に従っているので、何かを返す必要があります。 Foreachは私にもう一本のリターンではなく、別のリターンを使用させるでしょう。私が何かを忘れた場合を除いて? – arvymetal

+0

これについては、以下の他の回答を参照してくださいが、ここではコードの可読性が低すぎると思いますので、次の開発者を保存するために数行のコードを追加することをお勧めしますコード。 – Sirko

1

を(あなたが必要なもの、おそらくされていない、同じ要素から成る二つの配列で終わるでしょうmap()を使用して) OPは一般的な質問をしていたと思う。

一般に、どのようにプロパティを割り当ててオブジェクト全体を返すのですか?これは私の提案です:

function mutateObject(element, value) { 
 
\t return (element.prop = value) && element || element 
 
} 
 

 
var object = {prop:1} 
 
var returned = mutateObject(object, 2) 
 

 
console.log(returned)

それがどのように動作しますか?最初の部分(element.prop = value)はプロパティにvalueを割り当て、valueを式に返します。

戻り値がfalsyの場合は、||句の値が返されます。真実ならば&&の値が返されます。

このケースでは、element自体を両方とも返します。これは、プロパティに設定されているオブジェクトに関係なく常に返されるオブジェクトです。

これを書き込む別の方法は(element.prop = value) ? element : elementですが、この構文では、比較の代わりに割り当てがあるように見えるので、他の構文はよく似ています。

+0

あなたが提案する構文はNitzanとほぼ同じです(結果を返すためにAND/OR演算子を使用する)。彼はちょうどあなたの前に答えた...私は2つの小切手を与えることはできません申し訳ありません。 – arvymetal

2

あなたは@Sirkoが書いたものを行うが、そのようにそれを返すことができます:あなたは「ワンライナー」を与えるforEachを使用して代わりに、mapを使用する必要はありません

SomeCallThatReturnsAPromise.then(entries => entries.forEach(entry => entry.isFeatured = true) || entries) 

が、その後、あなたは戻りたいですあなたが受け取ったのと同じ値で、論理式(||)を使ってそれを行うことができます。

+0

いいえ、それは配列のコピーを保存します – arvymetal

+0

私はそれを読んでいますが、それはまだ読める構文です、多分私はそれを採用するでしょう(少なくとも、ジェネリックについてTSドキュメンテーションのいくつかのセクションよりも読みやすいです) – arvymetal

関連する問題