JavaScript是否像Python一样支持数组/列表推导式?

Does JavaScript support array/list comprehensions like Python?

本文关键字:数组 支持数 列表 支持 一样 Python 是否 JavaScript      更新时间:2023-09-26

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

我基本上试图从每个单独的整数从字符串中获得一个数组用于实践目的。我更精通Python而不是JavaScript

Python:

string = '1234-5'
forbidden = '-'
print([int(i) for i in str(string) if i not in forbidden])

Javascript是否有类似的东西让我做上面?

更新:数组推导式从标准中删除。引用MDN:

数组推导式语法是非标准的,从Firefox 58开始删除。对于面向未来的用法,可以考虑使用Array.prototype。地图,Array.prototype。过滤器、箭头函数和扩展语法。

查看Array.prototype.map的示例答案:

let emails = people.map(({ email }) => email);

原始答:

是的,JavaScript将在即将到来的EcmaScript版本7中支持数组推导式。

下面是一个例子。

var str =  "1234-5";
var ignore = "-";
console.log([for (i of str) if (!ignore.includes(i)) i]);

给出问题的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 ]

下面是使用的Python和JavaScript代码元素的比较:(Python→Javascript):

  • 打印→console.log
  • 解压字符串到列表->传播算子
  • 列表理解式'if' ->Array.filter
  • 列表理解式'for' ->Array.map
  • substr in str?→string.includes

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

var string = "12=34-5";
var forbidden = "=-";
console.log(string.split("").filter(function(str){
    return forbidden.indexOf(str) < 0;
}).join(""))

如果输出分别为"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);
    }
});

不直接,但复制起来并不难。

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]);
    }
}

但是在for循环中没有内置的过滤方法

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

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)

JavaScript不再支持数组推导式。

我也在寻找JavaScript等效。Mozilla开发人员网络表明不再支持此功能。在前面的链接中引用了首选语法。

为了"完整"起见,这里有一个较短的regexp版本。

var str =  "1234-5";
var ignore = "-=";
console.log(str.replace(new RegExp(ignore.split("").join("|")), "").split(""));

编辑:为了确保RegExp不会"阻塞"特殊字符,ignore可以实现为RegExp字面量,而不是字符串:

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

它确实有一个穷人版本

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来过滤字符串

你可以看看CoffeeScript。CoffeeScript为java-script添加了缺少的特性,使您可以编写更清晰、更易读的代码。https://coffeescript.org/coffeescript-2

你写一个.coffee文件,coffescript编译器将你的咖啡文件编译成一个JavaScript文件。因为转换成JavaScript是通过编译完成的,所以脚本的运行速度不会变慢。

所以你的代码在咖啡脚本中看起来像下面这样:
string = '1234-5'
forbidden = '-'
alert(JSON.stringify(+i for i in string when i isnt forbidden))

老实说,这比python版本更容易阅读。它可以快速编译成如下的JavaScript:

var forbidden, i, string;
string = '1234-5';
forbidden = '-';
alert(JSON.stringify((function() {
  var j, len, results;
  results = [];
  for (j = 0, len = string.length; j < len; j++) {
    i = string[j];
    if (i !== forbidden) {
      results.push(+i);
    }
  }
  return results;
})()));

你甚至不需要安装任何东西。你可以在他们的网站上试用一下,它会显示翻译后的JavaScript代码。

Javascript不需要列表推导式,因为与Python相比,mapfilter函数在该语言中工作得更好。

在Python中

:

[int(i) for i in '1234-5' if i != '-'] 
# is equivalent to the ugly
list(map(lambda _: int(_),filter(lambda _: _!='-','1234-5')))
# so we use list comprehensions

在Javascript中,对我来说只要熟悉语法就可以了:

[...'1234-5'].filter(_=> _!='-').map(_=> parseInt(_))