让Javascript做一些类似Python的列表理解的事情,最干净的方法是什么?
在Python中,如果我有一个对象列表,我想“拉出”它的名称,我会这样做……
list_of_names = [x.name for x in list_of_objects]
在javascript中,除了使用for循环构造之外,我并没有真正看到一种更“漂亮”的方法。
仅供参考:我正在使用jQuery;也许它有一些很好的特性使这成为可能?
更具体地说,假设我使用$('input')
这样的jQuery选择器来获取所有input
元素,如何才能最简洁地为每个input
元素创建一个包含所有name
属性的数组--即一个数组中的所有$('input').attr('name')
字符串?
发布于 2011-02-11 09:01:43
使用Array.map的通用情况,需要javascript1.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
的其他答案是错误的;不是代码本身,而是实现不是最优的。
编辑:在Javascript1.7中也引入了Array comprehensions,但这纯粹依赖于语法,不能在本地缺乏它的浏览器上模拟。这是您在Javascript中所能获得的与您发布的Python代码片段最接近的东西。然而,got removed from the language
发布于 2013-08-31 04:56:37
列表理解有几个部分。
从set of Something
中选择一组set of set
在JavaScript中,从ES5开始(所以我认为IE9+、Chrome和FF都支持),你可以在数组上使用map
和filter
函数。
您可以使用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
。
发布于 2012-07-18 04:48:04
那些对“漂亮的”Javascript感兴趣的人应该看看CoffeeScript,这是一种编译成Javascript的语言。它的存在本质上是因为Javascript缺少诸如列表理解之类的东西。
特别是,Coffeescript的列表理解甚至比Python的更灵活。参见list comprehension docs here。
例如,这段代码将产生一个input
元素的name
属性数组。
[$(inp).attr('name') for inp in $('input')]
然而,一个潜在的缺点是生成的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;
})()
];
https://stackoverflow.com/questions/4964456
复制相似问题