Scala';s";“为了理解”;在Javascript中
我已经习惯了Scala的“for”结构,并且非常喜欢它。我现在正在编写一些Javascript代码,并使用Lo Dash(基本上是下划线的扩展)。有没有办法在javascript中模仿Scala的“for”理解 我的目标是清理映射/减少类似以下内容的代码: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 ) {
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() + ")";
}));