JavaScript是否像Python一样支持数组/列表推导式?
Does JavaScript support array/list comprehensions like Python?
我正在练习/学习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相比,map
和filter
函数在该语言中工作得更好。
:
[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(_))
- 为什么typeof的数组的数组的未定义值返回为“0”;未定义的“;我的条件不认为是真的
- 在 javascript 中添加数组到数组
- javascript:更改应用到的数组的数组方法列表
- 按子数组处理数组
- 使用JavaScript's Reduce从对象数组创建数组
- 解析json数组到数组javascript
- 使用包含参数数组的数组调用函数,而不是仅列出数组
- 来自对象数组的数组中的特定元素
- 如何将函数应用于两个数组的第 n 个元素(数组的数组)
- 来自数组内数组的角度 ng 重复显示值
- 如何使用 angularjs 从 json 数组访问数组
- 在表示二维数组的数组中查找对角线
- JavaScript 从对象中的数组获取数组
- JavaScript 数组到数组
- 显示按表单构建的数组的数组元素总数
- 清理包含数组的数组中的重复
- 数组中数组的长度
- 在javascript函数中重命名数组(将数组分配给新名称)
- 是Javascript中支持的数组的数组
- 在Google Apps Script中,数组支持哪些功能?