Javascript在对象数组中执行.join值

如果我有一个string数组,我可以使用.join()方法来获取一个string,每个元素用逗号分隔 – 就像这样:

 ["Joe", "Kevin", "Peter"].join(", ") -> "Joe, Kevin, Peter" 

我有一个对象数组,我想对其中的值执行类似的操作; 所以从

 [ {name: "Joe", age: 22}, {name: "Kevin", age: 24}, {name: "Peter", age: 21} ] 

只在name属性上执行join方法,以实现与以前相同的输出。

目前我有以下function:

 function joinObj(a, attr) { var out = []; for (var i=0; i<a.length; i++) { out.push(a[i][attr]); } return out.join(", "); } 

这段代码没有什么问题,它可以工作,但突然之间,我已经从一个简单,简洁的代码行变成了一个非常必要的function。 是否有更简洁,更理想的写作方式?

如果你想映射对象(在这种情况下属性)。 我想Array.prototype.map是你想要的,如果你想在function上编码。

 [ {name: "Joe", age: 22}, {name: "Kevin", age: 24}, {name: "Peter", age: 21} ].map(function(elem){ return elem.name; }).join(","); 

(小提琴)

如果你想支持旧版浏览器,那不是ES5投诉,你可以填充它(上面的MDN页面有一个polyfill)。 另一种方法是使用underscorejs的pluck方法:

 var users = [ {name: "Joe", age: 22}, {name: "Kevin", age: 24}, {name: "Peter", age: 21} ]; var result = _.pluck(users,'name').join(",") 

那么你总是可以覆盖你的对象的toString方法:

 var arr = [ {name: "Joe", age: 22, toString: function(){return this.name;}}, {name: "Kevin", age: 24, toString: function(){return this.name;}}, {name: "Peter", age: 21, toString: function(){return this.name;}} ]; var result = arr.join(", "); //result = "Joe, Kevin, Peter" 

我不知道是否有一个更简单的方法来做到这一点,而不使用外部库,但我个人喜欢 underscore.js ,它有很多用于处理数组,集合等的工具。

用下划线你可以用一行代码轻松做到这一点:

_.pluck(arr, 'name').join(', ')

我也遇到了使用reduce方法,这是它看起来像:

 [ {name: "Joe", age: 22}, {name: "Kevin", age: 24}, {name: "Peter", age: 21} ].reduce(function (a, b) {return (a.name || a) + ", " + b.name}) 

(a.name || a)是正确处理的第一个元素,但其余的(其中a是一个string,所以a.name是未定义的)不被视为一个对象。

编辑:我现在进一步重构它:

 x.reduce(function(a, b) {return a + ["", ", "][+!!a.length] + b.name;}, ""); 

我认为它更清洁,因为a总是一个string, b总是一个对象(由于在reduce使用了可选的initialValue参数 )

6个月后编辑:哦,我在想什么。 “清洁器”。 我惹怒了密码神。

可以说对象数组是由variablesusers引用的

如果ES6可以使用,那么最简单的解决scheme将是:

 users.map(user => user.name).join(', '); 

如果没有,并且可以使用lodash :

  _.map(users, function(user) { return user.name; }).join(', '); 

尝试这个

 var x= [ {name: "Joe", age: 22}, {name: "Kevin", age: 24}, {name: "Peter", age: 21} ] function joinObj(a, attr) { var out = []; for (var i=0; i<a.length; i++) { out.push(a[i][attr]); } return out.join(", "); } var z = joinObj(x,'name'); z > "Joe, Kevin, Peter" var y = joinObj(x,'age'); y > "22, 24, 21" 

在节点或ES6上:

users.map(u => u.name).join(', ')