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

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


当前回答

这招对我很管用:

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

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

其他回答

如果您想将对象映射到某些东西(在本例中是属性)。我认为数组。prototype。map是你要寻找的如果你想要功能性编码的话。

(小提琴)

如果你想支持不兼容ES5的旧浏览器,你可以shim它(上面的MDN页面上有一个填充)。另一种选择是使用下划线的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",年龄:22岁,toString: function(){返回this.name;}}, {name:“Kevin”,年龄:24,toString: function(){返回this.name;}}, {name: "Peter",年龄:21岁,toString: function(){返回this.name;}} ]; Var结果= arr。加入(","); console.log(结果);

我也遇到过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 objs = [ {名字:“乔”,年龄:22岁}, {姓名:“凯文”,年龄:24}, {姓名:“彼得”,年龄:21岁} ]; document.body.innerHTML = Object.values(objs).map(函数(obj){ 返回obj.name; });

假设对象数组由变量users引用

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

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

如果不是,和lodash可以这样使用:

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