【问题标题】:Javascript: Iterating over object and concatenate stringsJavascript:迭代对象并连接字符串
【发布时间】:2015-12-21 19:41:33
【问题描述】:

我有一个 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' 而不是逗号或根本没有逗号来做出适当的反应。我该怎么做?

【问题讨论】:

  • angular.forEach(objects, function(o,i,r) { ... if(r[i+1]) myString+=", "; 但更好的是myString=angular.map(objects, function(o) { return o.name;}).join(", ");

标签: javascript angularjs string iteration string-concatenation


【解决方案1】:

这是一个使用 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

【讨论】:

  • 您的解决方案在“和”之前添加了一个逗号。您必须以某种方式合并最后一个元素和最后一个元素之前的元素。
  • 那个逗号被称为“牛津逗号”。我认为这在这里说得通!无论如何,我会根据您的要求更新我的解决方案。
  • 好吧,谁说 stackoverflow 只能教编程 - 我不知道牛津逗号 :) 但是,我将此代码用于仅以德语发布的应用程序,没有串行逗号之类的东西,因此我的用例需要进行更改。感谢您的编辑和帮助,非常感谢。
【解决方案2】:

试试类似的东西

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 + ', ';
   }

}

【讨论】:

    【解决方案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;
    }
    

    【讨论】:

    • objects 是一个对象而不是一个数组,因此没有 length 属性。还有o 来自哪里?
    猜你喜欢
    • 2013-01-26
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 2023-03-23
    相关资源
    最近更新 更多