JavaScript是否支持Python之类的数组/列表推导?

A K*_*A K 39 javascript python

我正在练习/学习JavaScript和Python.我想知道Javascript是否与这种类型的编码等效.

我基本上试图从字符串中的每个单独的整数中获取一个数组用于练习目的.我比Python更擅长Python

蟒蛇:

string = '1234-5'

forbidden = '-'

print([int(i) for i in str(string) if i not in forbidden])
Run Code Online (Sandbox Code Playgroud)

Javascript上面有类似的内容吗?

DRD*_*DRD 11

更新:从标准中删除了数组解析.引用MDN:

数组解析语法是非标准的,并从Firefox 58开始删除.对于面向未来的用法,请考虑使用Array.prototype.map,Array.prototype.filter,箭头函数和扩展语法.

原始答案:

是的,JavaScript将在即将发布的EcmaScript版本7中支持数组理解:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions.

这是一个例子:数组理解.

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

console.log([for (i of str) if (!ignore.includes(i)) i]);
Run Code Online (Sandbox Code Playgroud)

  • 我相信OP正在询问他们今天可以实际运行的JavaScript代码,而不是在未来的某个无限期. (17认同)
  • MDN页面https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions在顶部说:"数组理解是非标准的,并且不太可能被添加到ECMAScript中".http://stackoverflow.com/questions/33872615/are-es6-array-comprehensions-no-longer-valid似乎有更多细节 (14认同)
  • Babel.js transcompiler支持理解:https://babeljs.io/repl/. (2认同)
  • 万一其他人在多年后偶然发现这个答案,这不会像上面链接中提供的“示例”所证明的那样起作用。 (2认同)

Col*_*ett 11

鉴于问题的 Python 代码

print([int(i) for i in str(string) if i not in forbidden])
Run Code Online (Sandbox Code Playgroud)

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

print([int(i) for i in str(string) if i not in forbidden])
Run Code Online (Sandbox Code Playgroud)

以下是所使用的 Python 和 JavaScript 代码元素的比较:(Python -> Javascript):

  • 打印 -> console.log
  • 迭代字符串中的字符 ->展开运算符
  • 列表理解 'if' -> Array.filter
  • 列表理解 'for' -> Array.map
  • str中的substr?-> string.includes


Jar*_*a X 8

阅读代码,我认为禁止可以有超过1个字符.我也假设输出应该是"12345"

var string = "12=34-5";

var forbidden = "=-";

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

如果输出在单独的行上为"1""2""3""4""5"

var string = "12=34-5";

var forbidden = "=-";

string.split("").forEach(function(str){
    if (forbidden.indexOf(str) < 0) {
        console.log(str);
    }
});
Run Code Online (Sandbox Code Playgroud)


Cha*_*adF 5

不直接,但不难复制。

var string = "1234-5";

var forbidden = "-";

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

我想更直接:

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

但是没有内置的方法可以过滤您的for循环。