2015-07-11 38 views
17

我正在练习/学习JavaScript和Python。我想知道Javascript是否与这种编码类似。JavaScript是否支持Python之类的数组/列表解析?

我基本上试图从字符串中的每个单独的整数中获取数组用于练习目的。我更精通Python的不是JavaScript

的Python:

string = '1234-5' 

forbidden = '-' 

print([int(i) for i in str(string) if i not in forbidden]) 

确实的Javascript对我有类似的东西上面做什么?

+0

不,它不。虽然JavaScript确实支持[高阶函数](https://en.wikipedia.org/wiki/Higher-order_function),ES5在Array.prototype中添加了对某些基本映射/过滤器支持的支持(但没有直接的平面映射,尽管可以模拟map-concat)。还有一些额外的库,比如下划线,它增加了这组“基元”,这是Python在列表理解语法伪装下所做的。 – user2864740

+0

请参阅http://stackoverflow.com/questions/33872615/are-es6-array-comprehensions-no-longer-valid –

回答

8

是 “1” “2” “3” “4” “5”, JavaScript将支持即将发布的EcmaScript版本7中的阵列解析:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions

下面是一个例子:Array Comprehensions

var str = "1234-5"; 
var ignore = "-"; 

console.log([for (i of str) if (!ignore.includes(i)) i]); 
+7

我相信OP在询问他们今天可以实际运行的JavaScript代码,而不是在无限期的时间未来。 –

+2

Babel.js反编译器支持解析:https://babeljs.io/repl/。 – DRD

+1

巴别特太棒了!也许你可以扩展一下你的答案,给出一个例子,说明这个语法是什么,以及如何在今天的浏览器中使用Babel。 –

4

不是直接的,但它不难复制。

var string = "1234-5"; 

var forbidden = "-"; 

string.split("").filter(function(str){ 
    if(forbidden.indexOf(str) < 0) { 
     return str; 
    } 
}).forEach(function(letter) { console.log(letter);}); 

我想更直接:

for(var i=0 ; i < str.length ; i++) { 
    if(forbidden.indexOf(str) < 0) { 
     console.log(str[i]); 
    } 
} 

但有没有内置的方式在你的循环过滤。

8

阅读代码,我认为禁止可以有超过1个字符。我也假设输出应为 “12345”

var string = "12=34-5"; 

var forbidden = "=-"; 

console.log(string.split("").filter(function(str){ 
    return forbidden.indexOf(str) < 0; 
}).join("")) 

如果输出是在单独的行

var string = "12=34-5"; 

var forbidden = "=-"; 

string.split("").forEach(function(str){ 
    if (forbidden.indexOf(str) < 0) { 
     console.log(str); 
    } 
}); 
2

对于“完整性” - 吃,这是一个较短的正则表达式版本。

var str = "1234-5"; 
var ignore = "-="; 

console.log(str.replace(new RegExp(ignore.split("").join("|")), "").split("")); 

编辑:为了确保正则表达式不会对特殊字符“呛”,ignore可以实现为正则表达式的文字,而不是字符串:

var str = "1234-5"; 
var ignore = /[\+=-]/; 
console.log(str.replace(ignore, "").split("")); 
+0

'var ignore =“ - + =”;' –

+0

当然,我真的很喜欢你的解决方案以及;它更多地在我的编码类型 –

+0

@MichaelGeary:看到我的更新。 – DRD

0

它确实有一个贫穷的芒版本

const string = '1234-5' 

const forbidden = '-' 

print([int(i) for i in str(string) if i not in forbidden]) 
const result = string.split('').filter(char => char !== forbidden); 
console.log(result) 

在JS中,你只能迭代数组中的单个元素,所以不能像Python一样一次提取多个条目。

对于这种特殊情况,您应该使用RegExp来过滤字符串。

1

您可以使用应用程序函子轻松实现此行为。

Array.prototype.ap = function(xs) { 
    return this.reduce((acc, f) => acc.concat(xs.map(f)), []) 
} 


const result = [x => x +1].ap([2]) 
console.log(result) 
0

鉴于问题的Python代码

print([int(i) for i in str(string) if i not in forbidden]) 

这是最直接翻译成JavaScript(ES2015):

const string = '1234-5'; 
 
const forbidden = '-'; 
 

 
console.log([...string].filter(c => !forbidden.includes(c)).map(c => parseInt(c))); 
 
// result: [ 1, 2, 3, 4, 5 ]

这里是一个比较的t他Python和JavaScript代码元素被使用: (Python的 - >使用Javascript):

  • 打印 - >的console.log
  • 迭代在字符串中的字符 - >spread operator
  • 列表理解 '如果' - >Array.filter
  • 列表理解 '为' - 在海峡>Array.map
  • SUBSTR? - > string.includes