首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对对象数组中的值执行.join

对对象数组中的值执行.join
EN

Stack Overflow用户
提问于 2013-05-17 19:10:54
回答 11查看 283.9K关注 0票数 357

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

这段代码没有错,它可以工作,但是突然之间,我从一行简单、简洁的代码变成了一个非常命令式的函数。有没有一种更简洁、更理想、更实用的方式来写这篇文章呢?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 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(","));

(fiddle)

如果你想支持不是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(",")
票数 642
EN

Stack Overflow用户

发布于 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);

票数 78
EN

Stack Overflow用户

发布于 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个月后编辑:哦,我到底在想什么。“清洁工”我激怒了代码之神。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16607557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档