1

静的なアイテムのセットを合体させるのは簡単です。

var finalValue = configValue || "default"; # JavaScript
finalValue = configValue ? "default" # CoffeeScript

しかし、未知の長さの配列を合体させる簡単な方法はありますか?私が思いついた最も簡単なものはこれ(CoffeeScript)でした:

coalesce = (args) -> args.reduce (arg) -> arg if arg?
coalesce [1, 2] # Prints 1

単純なリストの場合は問題ありませんが、

  1. 理想的にcoalesceは繰り返し処理する必要がありますが、をargumentsサポートしていません。reduce
  2. 配列に関数が含まれている場合は、関数自体ではなく戻り値を返したい場合があります(これは私のユースケースです)。

Guffaのソリューションに基づいて、CoffeeScriptバージョンを次に示します。

coalesce = (args) -> args[0]() ? coalesce args[1..]

テストインcoffee

fun1 = ->
  console.log 1
  null
fun2 = ->
  console.log 2
  2
fun3 = ->
  console.log 3
  3
coalesce [fun1, fun2, fun3]

プリント

1 # Log
2 # Log
2 # Return value
4

1 に答える 1

3

あなたはこのようにすることができます:

function coalesce(arr) {
  if (arr.length == 0) return null;
  var v = arr[0];
  v = (typeof v == "function" ? v() : v);
  return v | coalesce(arr.slice(1));
}

例:

var finalValue = coalesce([ null, null, function(){ return null; }, 5 ]);
// finalValue is now 5
于 2012-04-24T13:59:17.160 に答える