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(', ')