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 回答