2016-04-12 5 views
0

Ich habe dies gelöst, aber ich bin auf der Suche nach einem besseren Weg, dies zu tun. Fiddle - https://jsfiddle.net/143h9wrq/ Also was ich tue ist zu überprüfen, ob es 2+ Ids gibt, dann die Zeichenfolge in ein Array, nehmen Sie das letzte Array-Element und fügen Sie 'und', fügen Sie es wieder zusammen und zeigen Sie es an.Hinzufügen eines "und" zum letzten Wort in String - js/Angular

Ich bin auf der Suche, ob es einen besseren Weg gibt zu kondensieren, wenn. Ich verwende Angular im Projekt, nicht im Beispiel. Basic listArr wäre $ scope.listArr und issues ist $ user.issues.

JS:

var issuesId =[1,2,3,4] 
var issues = "issue one, issue two, issue three, issue four"; 

if (issuesId.length >= 2) { 
    var str = issues.split(', '); 
    var addAnd = str.pop(); 
    addAnd = 'and ' + addAnd; 
    str.push(addAnd); 
    var listArr = str.join(', '); 
    document.getElementById('text').innerHTML = listArr; 
} 
else { 
    var listArr = issues; 
    document.getElementById('text').innerHTML = listArr; 
} 

HTML:

<p>{{listArr}}</p> 
+0

Ich denke, Ihr Ansatz ist mehr als gültig – cor

+0

Die einzige Problem, das ich mit Ihrem Ansatz sehe, ist, dass Sie mit einem Satz enden, der nicht korrekt ist, da es ein ',' vor 'und' einfügt, wenn keiner gebraucht wird. – GillesC

+0

Diese Frage ist mit 'angularjs' getaggt - und dieser Ansatz ist nichts wie ein angularjs Ansatz –

Antwort

3

Die kürzeste Lösung mit regulären Ausdrücken sein wird:

var s = "a, b, c"; 

s.replace(/ ([^,]*)$/, " and $1"); // "a, b, and c" 

oder:

s.replace(/, ([^,]*)$/, " and $1"); // "a, b and c" 
+0

Dies ist perfekt danke. Wenn Sie Zeit haben, würde es Ihnen etwas ausmachen, einen kurzen Überblick darüber zu geben, was was macht. Ich habe RegEx schon früher benutzt und liebe https://regex101.com/, vergesse aber immer was was macht:] – RooksStrife

3

Warum nicht das letzte Element des Arrays ändern, direkt aus dem Array, ohne poping und es wieder zurück, wie diese drängen: str[str.length - 1] = 'and ' + str[str.length - 1]?

habe eine Reihe von Codezeilen abgespeckte ich auch:

var issuesId = [1, 2, 3, 4] 
var issues = "issue one, issue two, issue three, issue four"; 

var listArr = issues; 

if (issuesId.length >= 2) { 
    var str = issues.split(', '); 
    str[str.length - 1] = 'and ' + str[str.length - 1]; 
    listArr = str.join(', '); 
} 

document.getElementById('text').innerHTML = listArr; 
0

Weitere funktionalen Stil. Versuchen Sie folgendes:

var issuesId =[1,2,3,4] 
var issues = "issue one, issue two, issue three, issue four"; 

if(issuesId.length >= 2){ 
    var arr = issues.split(','); 

    arr = arr.map(function(phrase, index){ 
    if(index < arr.length - 1) 
    phrase+=' and'; 
    return phrase; 
    }) 
    issues = arr.join(', '); 
} 

console.log(issues); 

http://codepen.io/gpincheiraa/pen/bpLJdv

0

Im Allgemeinen würde ich die String-Manipulation in eine Funktion wickeln, es von der eigentlichen dom Manipulation Trennung:

function mkStr(issues) { 
    var delimeter = ', '; 
    if (issues.length < 2) { 
     return issues; 
    } else { 
    let parts = issues.split(delimeter); 
    let last = "and " + parts.pop(); 
    parts.push(last); 
    return parts.join(delimeter); 
    } 
} 

document.getElementById('text').innerHTML = mkStr(issues); 

mkStr("a, b, c"); // "a, b, and c" 

Aber vielleicht wollen Sie lieber "a, b und c" als Ausgabe haben - das wäre irgendwie natürlicher. Dann könnten Sie so etwas tun:

function mkStr2(issues) { 
    var delimeter = ', '; 
    if (issues.length < 2) { 
     return issues; 
    } else { 
    let parts = issues.split(delimeter); 
    let last = parts.pop(); 
    return parts.join(delimeter) + 
      " and " + 
      last; 
    } 
} 

mkStr2("a, b, c"); // "a, b, and c" 
Verwandte Themen