2014-03-07 77 views
2

我已經習慣了Scala的「for」構造,並且喜歡它很多。我現在正在編寫一些Javascript代碼,並使用Lo-Dash(基本上是Underscore的擴展)。有沒有什麼辦法來模仿斯卡拉在javascript中的「for」理解?斯卡拉的「用於理解」的Javascript

我的目標是清洗地圖/減少與此類似代碼:

var rawCoordinates = _.map(directionsRoute.legs, function (leg) { 
    return _.map(leg.steps, function (step) { 
     return _.map(step.path, function (latLng) { 
     return [ latLng.lng(), latLng.lat() ]; 
     }); 
    }); 
}); 
var finalCoordinates = _.flatten(rawCoordinates, true); 

在代碼中,我產生座標的陣列中的格式[[coord1,coord2,coord3],[coord4,coord5]],其中每個座標爲[39.5, -106.2](它是一個數組每一個谷歌地圖的方向的座標的步驟

在Scala中,同樣的事情可以這樣寫(糾正我,如果我錯了):

val stepCoordinates:List[List[Tuple2[Number,Number]]] = for { 
    leg <- legs; 
    step <- leg.steps; 
    path <- step.path; 
    latLng <- path 
} yield (latLng.lng(), latLng.lat()) 

謝謝!

+1

事實上Scala的理解[可能會這樣寫(http://scalafiddle.net/console/46515dcd99ea50dd0671bc6840830404),所以它會更容易理解 –

+2

沒有必要對嵌套'for'在你的Scala代碼。 –

+0

哦好點,我修正了 –

回答

2

JavaScript不能用新的關鍵字或操作符擴展,但這些並不重要。我們可以和平常的功能一起生活,看起來不那麼好,但是很可讀。下面是一個執行嵌套for循環的函數的示例。

function deepMap(xs, path, fn) { 
    function impl(xs, path, args) { 
     var result = new Array(xs.length); 
     if (path.length == 0) { 
      for (var i = 0; i < xs.length; i++) { 
       result[i] = fn.apply(null, args.concat([xs[i]])); 
      } 
      return result; 
     } else { 
      for (var i = 0; i < xs.length; i++) { 
       result[i] = impl(xs[i][path[0]], path.slice(1), args.concat(xs[i])); 
      } 
      return result.reduce(function(x, y) {return x.concat(y)}, []); 
     } 
    } 
    return impl(xs, path, []); 
} 

// for generating lat and long functions 
function x(x) {return function() {return x}} 

// sample data 
var legs = [{ 
    steps: [{ 
     path: [{lat: x(1), lng: x(2)}] 
    }, { 
     path: [{lat: x(2), lng: x(3)}] 
    }] 
}, { 
    steps: [{ 
     path: [{lat: x(3), lng: x(4)}] 
    }, { 
     path: [{lat: x(4), lng: x(5)}] 
    }] 
}]; 

// prints [ '(1, 2)', '(2, 3)', '(3, 4)', '(4, 5)' ] 
console.log(deepMap(legs, ['steps', 'path'], function(leg, step, ll) { 
    return "(" + ll.lat() + ", " + ll.lng() + ")"; 
})); 
+0

實現,使用,樣本輸入和輸出。很好的答案。 – Cheezmeister