如果我有一个字符串数组,我可以使用.join()
方法来获取单个字符串,每个元素用逗号分隔,如下所示:
["Joe", "Kevin", "Peter"].join(", ") // => "Joe, Kevin, Peter"
我有一个对象数组,并且我想对其中保存的值执行类似的操作;所以从
[
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
]
仅对name
属性执行join
方法,以获得与前面相同的输出。
目前我有以下功能:
function joinObj(a, attr){
var out = [];
for (var i = 0; i < a.length; i++){
out.push(a[i][attr]);
}
return out.join(", ");
}
这段代码没有错,它可以工作,但是突然之间,我从一行简单、简洁的代码变成了一个非常命令式的函数。有没有一种更简洁、更理想、更实用的方式来写这篇文章呢?
发布于 2013-05-17 19:13:29
如果要将对象映射到某个对象(在本例中为属性)。我认为如果你想编写函数式代码,Array.prototype.map
就是你要找的。
console.log([
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
].map(function(elem){
return elem.name;
}).join(","));
在现代JavaScript中:
console.log([
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
].map(e => e.name).join(","));
如果你想支持不是ES5 compliant的旧浏览器,你可以填充它(上面的MDN页面上有一个polyfill )。另一种选择是使用underscorejs的pluck
方法:
var users = [
{name: "Joe", age: 22},
{name: "Kevin", age: 24},
{name: "Peter", age: 21}
];
var result = _.pluck(users,'name').join(",")
发布于 2013-05-17 19:17:03
你可以随时覆盖你的对象的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(", ");
console.log(result);
发布于 2013-06-10 21:38:45
我也遇到过使用reduce
方法,它看起来是这样的:
console.log(
[
{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
是一个字符串,所以a.name
是未定义的)不被当作对象来处理。
编辑:我现在将其进一步重构为:
x.reduce(function(a, b) {return a + ["", ", "][+!!a.length] + b.name;}, "");
我认为这样更简洁,因为a
总是一个字符串,b
总是一个对象(因为在reduce
中使用了optional initialValue parameter )
6个月后编辑:哦,我到底在想什么。“清洁工”我激怒了代码之神。
https://stackoverflow.com/questions/16607557
复制相似问题