如果我有一个字符串数组,我可以使用.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(", ");
}
这段代码没有什么问题,它可以工作,但突然之间,我从简单、简洁的代码行变成了一个非常命令式的函数。有没有更简洁,更实用的写法呢?
我也遇到过reduce方法,它是这样的:
console.log (
[
{名字:“乔”,年龄:22岁},
{姓名:“凯文”,年龄:24},
{姓名:“彼得”,年龄:21岁}
]
.reduce(函数(a, b) {
返回(a.name || a) + ", " + b.name}
)
)
(a.name || a)因此第一个元素被正确处理,但其余(其中a是字符串,因此a.name是未定义的)不被视为对象。
编辑:我现在进一步重构了它:
x.reduce(function(a, b) {return a + ["", ", "][+!!a.length] + b.name;}, "");
我相信这是干净的,因为a始终是一个字符串,b始终是一个对象(由于使用可选的initialValue参数在减少)
6个月后编辑:哦,我在想什么。“清洁”。我激怒了代码之神。
试试这个
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"
这是我知道的一个老话题,但对任何遇到这个话题的人来说仍然非常重要。
数组中。map是一个很棒的方法,我一直在用。
数组中。还提到了Reduce…
我个人会使用数组。这个用例的Reduce。
为什么?尽管代码稍微不那么干净/清楚。这比将map函数输送到连接要有效得多。
这是因为数组。Map必须遍历每个元素以返回一个包含数组中对象的所有名称的新数组。数组中。Join然后循环遍历数组的内容以执行连接。
您可以通过使用模板字面值来提高jackweirdys reduce answer的可读性,使代码变成一行。"所有现代浏览器也支持"
// a one line answer to this question using modern JavaScript
x.reduce((a, b) => `${a.name || a}, ${b.name}`);