Scala';s";“为了理解”;在Javascript中

Scala';s";“为了理解”;在Javascript中,javascript,scala,underscore.js,lodash,Javascript,Scala,Underscore.js,Lodash,我已经习惯了Scala的“for”结构,并且非常喜欢它。我现在正在编写一些Javascript代码,并使用Lo Dash(基本上是下划线的扩展)。有没有办法在javascript中模仿Scala的“for”理解 我的目标是清理映射/减少类似以下内容的代码: var rawCoordinates = _.map( directionsRoute.legs, function ( leg ) { return _.map( leg.steps, function ( step ) {

我已经习惯了Scala的“for”结构,并且非常喜欢它。我现在正在编写一些Javascript代码,并使用Lo Dash(基本上是下划线的扩展)。有没有办法在javascript中模仿Scala的“for”理解

我的目标是清理映射/减少类似以下内容的代码:

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步骤坐标:List[List[Tuple2[Number,Number]]]=for{

legJavascript不能用新的关键字或运算符进行扩展,但它们并不重要。我们可以使用常用函数,它们看起来可能不太好,但可读性很好。下面是一个执行嵌套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() + ")";
}));
函数深度映射(xs,path,fn){
函数impl(xs、path、args){
var result=新数组(xs.length);
if(path.length==0){
对于(变量i=0;i
事实上,scala的理解更容易理解,在scala代码中不需要嵌套的
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() + ")";
}));