Javascript:遍历对象并连接字符串

Javascript: Iterating over object and concatenate strings

我有一个 Javascript 对象,其中包含其他对象。每个包含的对象都有一个 name 属性。

我现在想做的是将这些名称属性连接成一个字符串。但是,我希望这些字符串在最后一个字符串之前用逗号和 'and' 分隔。

为了更好地理解,我要迭代的对象如下所示:

var objects = {
    o1: {name: 'name1'}, 
    o2: {name: 'name2'},
    o3: {name: 'name3'}
};

现在我最终想要的字符串是:'Concatenation of name1, name2 and name3'

到目前为止我试过的是使用 angular.forEach:

var myString = 'Concatenation of ';

angular.forEach(objects, function(o) {
    myString += o.name + ', ';
}

不难发现,我的字符串会变成 'Concatenation of name1, name2, name3, '

所以真正的问题是我如何检查我在我的对象中的哪个位置并通过连接 'and' 而不是逗号或根本没有逗号来适当地做出反应。我该怎么做?

使用传统的 for 循环:

var myString = 'Concatenation of ';
var i = 0;
var keys = Object.keys(objects);
for (i =0; i<keys.length; i++) {
   if (i > 0)
      myString += (i < keys.length - 1) ? ', ' : ' and ';
   myString += objects[keys[i]].name;
}

试试

var myString = 'Concatenation of ';
var i = 1;
angular.forEach(objects, function(o) {
  i += 1;
  if(i === Object.keys(objects).length) {
     myString = myString.subString(1, myString .length-1);
     myString += ' and '+ o.name;
   } else {
     myString += o.name + ', ';
   }

}

这是一个使用 jQuery 的简短而有趣的解决方案:

代码:

var myString = 'Concatenation of ';
var arr = $.map(objects, function(o) { return o["name"]; })
// append 'and ' to the last element before hand.
arr[arr.length - 1] = "and "+arr[arr.length - 1]; 
console.log(myString+arr.join(", "));
// Concantenation of name1, name2, and name3

Demo Fiddle

更新

这是不包含牛津逗号的更新代码:

var myString = 'Concatenation of ';
var arr = $.map(objects, function(o) { return o["name"]; })
var lastElem = " and " +arr.pop();
console.log(myString+arr.join(", ")+lastElem);
// Concantenation of name1, name2 and name3

Updated Fiddle