Javascript:在对象上迭代并连接字符串

Javascript:在对象上迭代并连接字符串,javascript,angularjs,string,iteration,string-concatenation,Javascript,Angularjs,String,Iteration,String Concatenation,我有一个Javascript对象,其中包含其他对象。每个包含的对象都有一个名称属性 我现在要做的是将这些名称属性连接到一个字符串。但是,我希望这些字符串在最后一个字符串之前用逗号和“”和“分隔 为了更好地理解,我要迭代的对象如下所示: var objects = { o1: {name: 'name1'}, o2: {name: 'name2'}, o3: {name: 'name3'} }; 现在,我希望最后的字符串是:“name1、name2和name3的串联”

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

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

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

var objects = {
    o1: {name: 'name1'}, 
    o2: {name: 'name2'},
    o3: {name: 'name3'}
};
现在,我希望最后的字符串是:
“name1、name2和name3的串联”

到目前为止,我尝试使用的是
angular.forEach

var myString = 'Concatenation of ';

angular.forEach(objects, function(o) {
    myString += o.name + ', ';
}
不难注意到,我的字符串将变成
“名称1、名称2、名称3的串联”


所以真正的问题是,我如何检查我在对象中的哪个位置,并通过连接
”和“
”而不是逗号或根本没有逗号来适当地作出反应。我如何才能做到这一点?

使用传统的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=0;
var keys=Object.keys(对象);
对于(i=0;i=0)
myString+=(i
试试下面的方法

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

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

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

objects
是一个对象而不是数组,因此没有
length
属性。还有,
o
从何而来?
angular.forEach(对象,函数(o,i,r){…if(r[i+1])myString+=”,”;
但更好的是做
myString=angular.map(对象,函数(o){返回o.name;})。join(“,”);
您的解决方案在“and”之前添加了一个逗号。您必须以某种方式将最后一个元素和最后一个元素之前的元素合并。这个逗号被称为“oxford逗号”。我认为这在这里是有意义的!无论如何,我会根据您的要求更新我的解决方案。嗯,谁说stackoverflow不能教的不仅仅是编程我不知道牛津逗号:)但是,我正在为一个仅以德语发布的应用程序使用此代码,其中没有串行逗号,因此我的用例需要更改。感谢您的编辑和帮助,非常感谢。