让JavaScript做列表理解

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

什么是最简洁的方法来使Javascript做类似 Python的列表理解?

在Python中,如果我有一个对象列表,其名称是我想“拉出”的,我会这样做......

list_of_names = [x.name for x in list_of_objects]

在JavaScript中,除了使用for循环构造之外,我并没有真正看到更多的“美丽”方式。

仅供参考:我正在使用jQuery; 也许它有一些漂亮的功能,使这成为可能?

更具体地说,假设我使用jQuery选择器$('input')来获取所有input元素,我将如何最干净地name为每个input元素创建一个包含所有属性的数组- 即数组中的所有$('input').attr('name')字符串?

提问于
用户回答回答于

使用Array.map的一般情况下,需要javascript 1.6(也就是说,可以在每个浏览器上工作,但IE <9),或者像MooTools这样的对象扩展框架适用于每个浏览器:

var list_of_names = document.getElementsByTagName('input').map(
  function(element) { return element.getAttribute('name'); }
);

jQuery特定的例子,适用于所有浏览器:

var list_of_names = jQuery.map(jQuery('input'), function(element) { return jQuery(element).attr('name'); });

其他答案使用.each是错误的; 不是代码本身,但实现是次优的。

也有在Javascript 1.7中引入的数组理解,但这完全依赖于语法,并且不能在本地缺乏它的浏览器上模拟。这是您可以在JavaScript中发布到您发布的Python代码片段中最接近的东西。

用户回答回答于

列表理解有几个部分。

  1. 选择一组东西
  2. 从一组东西
  3. 被某物过滤

在JavaScript中,从ES5开始(所以我认为在IE9 +,Chrome和FF中都支持),你可以在数组中使用mapfilter功能。

你可以用map和filter来做到这一点:

var list = [1,2,3,4,5].filter(function(x){ return x < 4; })
               .map(function(x) { return 'foo ' + x; });

console.log(list); //["foo 1", "foo 2", "foo 3"]

这就好像它不会设置其他方法或使用其他框架一样。

至于具体问题......

使用jQuery:

$('input').map(function(i, x) { return x.name; });

没有jQuery:

var inputs = [].slice.call(document.getElementsByTagName('input'), 0),
    names = inputs.map(function(x) { return x.name; });

[].slice.call()只是把它转换NodeList成一个Array

扫码关注云+社区