2013-02-08 14 views
7

Jak mogę włączyć tablicę, na przykład ["Susy", "John", "Mary"] do "Susy, John, and Mary" w JavaScript? Nie mogę wyrzucić mojej metody z metody Rubiego.Javascript Array do zdania

+2

nie tak poważnie, ale .. '[ "Susy", "Jan", "Mary"]. Join (' '). Split (/ M /). Przyłączenia (' i M'); ' – jAndy

Odpowiedz

6

Dołącz wszystkie elementy z wyjątkiem ostatniego, a następnie dodać, że:

var s = arr.slice(0, arr.length - 1).join(', ') + ", and " + arr.slice(-1); 

Demo: http://jsfiddle.net/JYKcK/1/

+0

Tylko jedna uwaga- Amerykanie kładą przecinek przed "i". OP to zrobił. – Popnoodles

+0

@popnoodles: Ah, wtedy wystarczy użyć '+" i "+". – Guffa

+0

Poszedłem tą metodą. – Corey

1

Można użyć .join() i poprzedzić ostatnią wartość z "i"

var array = ['susy', 'john', 'mary']; 

array[array.length-1] = 'and '+array[array.length-1]; 

//string is "susy, john, and mary" 
var string = array.join(', '); 
+0

Znam tej metody, chcę" i "przed ostatnim elementem. – Corey

+0

mój zły, nie widziałem "i" ... pozwól mi ponownie czynnik – joeltine

-1
var arr = ["Susy", "John", "Mary"]; 
var str = arr.join(", "); 
+1

To produkuje '" Susy, John, Mary "', który nie jest pożądany wynik. – pjmorse

2

zmodyfikuj ostatni, a następnie dołącz

var source = ["Susy", "John", "Mary"]; 
source.push('and ' +source.pop()); 
console.log(source.join(', '))// Susy, John, and Mary 
+0

OK, to jest bardziej seksowne :) Ale czy poprawne gramatycznie jest dodanie przecinka przed i? – mika

+0

Nie działa dla 1 i 2 elementów: ["Susy"] => "i Susy". ["Susy", "John"] => "Susy i John" –

2

Spróbuj tego:

var array = ['susy', 'john', 'mary']; 
var last = array.pop(); 
var string = array.join(', ') + " and " + last; 

Nie miałem t spróbować, ale należy się pomysł

1

a kolejne rozwiązanie:

(function(a) { 
    var b = (a||(a=[])).pop(); 
    return (b ? a.length ? [a.join(", "),b] : [b] : a).join(" and "); 
})(["Susy", "John", "Mary"]); 

lub po prostu określającą metodę zdanie Ruby-jak w prototyp tablicy:

Array.prototype.sentence = function(comma,and) { 
    var b = this.pop(); 
    return (b ? this.length ? [this.join(comma||", "),b] : [b] : this).join(and||" and "); 
}; 

["Susy", "John", "Mary"].sentence(); 
//"Susy, John and Mary" 

["Susy", "John", "Mary"].sentence(" and ", " as well as "); 
//"Susy and John as well as Mary" 

["Susy", "John", "Mary", "Helmut"].sentence(); 
//"Susy, John, Mary and Helmut" 
3

Inną opcją, używając Array.prototype.reduce, byłoby:

var arr = [1,2,3]; 
arr.reduce(
    function(prev, curr, i){ 
    return prev + curr + ((i===arr.length-2) ? ' and ' : ', ') 
    }, '') 
.slice(0, -2); 

Produkuje "1, 2 and 3".

2

Istnieje kilka dodatkowych przypadków w tym jednym:

  1. Czy chcemy mieć przecinek przed „i” (Oxford przecinek)
  2. Tak czy inaczej, nie chcemy przecinek if istnieją tylko 2 elementy
  3. Jeśli jest tylko jeden pierwiastek, chcemy tylko, że słowo zwrócone

myślę, że to pasuje do wszystkich tych przypadków użycia:

function joinSentence(array, oxford_comma){ 
    if(array.length > 1){ 
    var lastWord = " and " + array.pop(); 
    if(oxford_comma && array.length > 1){ 
     lastWord = "," + lastWord; 
    } 
    }else{ 
    var lastWord = ""; 
    } 
    return array.join(", ") + lastWord; 
} 
+0

To powinna być właściwa odpowiedź! – mech

2
toSentence = function(arr){ return arr.join(", ").replace(/,\s([^,]+)$/, ' and $1');}; 

toSentence(['dogs', 'cats']);   // => dogs and cats 

toSentence(['dogs', 'cats', 'snakes']); // => dogs, cats and snakes