首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使Javascript执行列表理解

使Javascript执行列表理解
EN

Stack Overflow用户
提问于 2011-02-11 08:44:37
回答 10查看 28.1K关注 0票数 65

让Javascript做一些类似Python的列表理解的事情,最干净的方法是什么?

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

代码语言:javascript
复制
list_of_names = [x.name for x in list_of_objects]

在javascript中,除了使用for循环构造之外,我并没有真正看到一种更“漂亮”的方法。

仅供参考:我正在使用jQuery;也许它有一些很好的特性使这成为可能?

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-02-11 09:01:43

使用Array.map的通用情况,需要javascript1.6(这意味着,除了IE <9之外,在每个浏览器上都可以工作),或者使用像MooTools这样的对象增强框架在每个浏览器上工作:

代码语言:javascript
复制
var list_of_names = document.getElementsByTagName('input').map(
  function(element) { return element.getAttribute('name'); }
);

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

代码语言:javascript
复制
var list_of_names = jQuery.map(jQuery('input'), function(element) { return jQuery(element).attr('name'); });

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

编辑:在Javascript1.7中也引入了Array comprehensions,但这纯粹依赖于语法,不能在本地缺乏它的浏览器上模拟。这是您在Javascript中所能获得的与您发布的Python代码片段最接近的东西。然而,got removed from the language

票数 54
EN

Stack Overflow用户

发布于 2013-08-31 04:56:37

列表理解有几个部分。

从set of Something

  • Filtered by

中选择一组set of set

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

您可以使用map和filter来执行此操作:

代码语言:javascript
复制
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的

代码语言:javascript
复制
$('input').map(function(i, x) { return x.name; });

没有jQuery的

代码语言:javascript
复制
var inputs = [].slice.call(document.getElementsByTagName('input'), 0),
    names = inputs.map(function(x) { return x.name; });

[].slice.call()只是将NodeList转换为Array

票数 11
EN

Stack Overflow用户

发布于 2012-07-18 04:48:04

那些对“漂亮的”Javascript感兴趣的人应该看看CoffeeScript,这是一种编译成Javascript的语言。它的存在本质上是因为Javascript缺少诸如列表理解之类的东西。

特别是,Coffeescript的列表理解甚至比Python的更灵活。参见list comprehension docs here

例如,这段代码将产生一个input元素的name属性数组。

代码语言:javascript
复制
[$(inp).attr('name') for inp in $('input')]

然而,一个潜在的缺点是生成的Javascript是冗长的(并且令人困惑):

代码语言:javascript
复制
var inp;
[
  (function() {
    var _i, _len, _ref, _results;
    _ref = $('input');
    _results = [];
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
      inp = _ref[_i];
      _results.push($(inp).attr('name'));
    }
    return _results;
  })()
];
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4964456

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档