2012-03-06 103 views
0

可以说我有2列:从另一个数组的变量创建数组的快速方法?

var a = []; 
var b = []; 

a.push({id:1, name:"Joe"}); 
a.push({id:2, name:"Jeff"}); 
a.push({id:3, name:"John"}); 

是否有一个快速的方法来填充b只有a的在Javascript的名字,还是我使用一个循环?

例如,像:

b = a[].name; // b is now ["Joe","Jeff","John"] 

回答

2

使用jQuery你可以说:

var b = $.map(a, function(val, i) { return val.name; }); 

jQuery's $.map() method相当于JavaScript的自己Array.map() method,除了后者是JS的一个相对较新的功能因此在旧版浏览器(即IE9之前版本)中不起作用。

+0

我喜欢这个解决方案比循环更好,我们使用jQuery和def。更喜欢一个方便的功能,而不必编写另一个该死的循环 – 2012-03-08 01:11:43

+0

酷。很显然,如果你有一些需要超高效的代码,你可以编写自己的循环来保存所有的函数调用,但对于“普通”情况,让'.map()'隐藏循环就更好了。 – nnnnnn 2012-03-08 02:37:47

2

如果你不关心旧的浏览器可以使用ES5 map method

b = a.map(function(elem) { 
    return elem.name; 
}); 

如果你关心老的浏览器,你可以填充工具的或者你可以使用正常的循环,正如你所建议的(尽管显然map方法总是使用某种形式的循环)。

+0

+1“不关注旧浏览器”解决方案! – kinakuta 2012-03-06 22:56:01

0

你将不得不循环。现在有各种各样的集合操作功能被烘焙到语言中。其中一个如果他们在这里会有用的是map

var b = a.map(function(person) { 
    return person.name; 
}); 

结帐的Underscore.js库,让很多像这样简单的操作。它有一个名为pluck的方法,这将是理想的。

var b = _.pluck(a, 'name'); 
3

循环必须以某种形式使用。无论是通过您的代码还是您调用的函数来执行特定元素的复制。用说map该解决方案还采用了发动机罩下的环路

for (var i = 0; i < a.length; i++) { 
    b.push(a[i].name); 
} 
0

您需要遍历a才能在每个名称的b中生成一个新数组。

0

它需要一个循环,但有库函数可以为你抽象循环。我倾向于使用Underscore.js来处理这些类型的东西(而且我通常免费使用它,因为我使用Backbone),但是您可以在JQuery中找到类似的功能,如$.map