如果我有一个字符串数组,我可以使用.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(", ");
}

这段代码没有什么问题,它可以工作,但突然之间,我从简单、简洁的代码行变成了一个非常命令式的函数。有没有更简洁,更实用的写法呢?


当前回答

在node或ES6+上:

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

其他回答

我不知道是否有不使用外部库的更简单的方法,但我个人喜欢underscore.js,它有大量用于处理数组、集合等的实用程序。

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

_。拔(arr的名字”)。加入(" ")

你总是可以重写对象的toString方法:

Var arr = [ {name: "Joe",年龄:22岁,toString: function(){返回this.name;}}, {name:“Kevin”,年龄:24,toString: function(){返回this.name;}}, {name: "Peter",年龄:21岁,toString: function(){返回this.name;}} ]; Var结果= arr。加入(","); console.log(结果);

在node或ES6+上:

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

这是我知道的一个老话题,但对任何遇到这个话题的人来说仍然非常重要。

数组中。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}`);

这招对我很管用:

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

 return users.map((user: { name: string; }) => user.name).join(", ");