2010-03-03 21 views
5

Ci scusiamo per questa domanda imbarazzante, ma sono ancora relativamente nuovo su javascript.Converti array in testo delimitato da virgole

Ho un array di nomi, qualcosa come

var myArray = ['Hill M','Zhang F','Dong L', 'Wilkinson JS', 'Harris N']; 

desidero restituire una stringa, con nomi separati da una virgola, ma con "e" tra i due nomi finali, cioè

'Hill M, Zhang F, Dong L, Wilkinson JS and Harris N' 

Qual è il modo più efficace per farlo in javascript?

ne dici se volevo trasporre i nomi e le iniziali, vale a dire per tornare

'M Hill, F Zhang, L Dong, JS Wilkinson and N Harris' 

risposta

19

Array::slice() Seleziona una parte di un array, e restituisce il nuovo array.
Array::join() Unisce tutti gli elementi di una matrice in una stringa
String::concat() Concatena due o più stringhe.

var myArray = ['Hill M','Zhang F','Dong L', 'Wilkinson JS', 'Harris N']; 

console.log(myArray.slice(0, myArray.length - 1).join(', ').concat(
      ' and ' + myArray[myArray.length - 1])); 

//Hill M, Zhang F, Dong L, Wilkinson JS and Harris N 

di cambiare il loro ordine:

var myArray = ['Hill M','Zhang F','Dong L', 'Wilkinson JS', 'Harris N']; 

for(var i = 0; i < myArray.length; i++) 
    myArray[i] = myArray[i].replace(/^(\S+)\s+(.+)$/, '$2 $1'); 

console.log(myArray.slice(0, myArray.length - 1).join(', ').concat(
      ' and ' + myArray[myArray.length - 1])); 

//M Hill, F Zhang, L Dong, JS Wilkinson and N Harris 

Nel caso in cui vi state chiedendo circa str.replace(/^(\S+)\s+(.+)$/, '$2 $1');

/^(\S+)\s+(.+)$/ è un'espressione regolare che corrisponde a una stringa che:

^ #starts with 
\S+ #one or more non whitespace characters, followed by 
\s+ #one or more whitespace characters, followed by 
.+ #one or more characters 

$1 e $2 in t la stringa sostitutiva sta per 1 ° e 2 ° gruppo (sotto-schemi racchiusi tra parentesi) dalla regex.

+1

E 'bello, ma dare qualche spiegazione, forse? OP ha detto che era nuovo di js. –

+0

Che funziona brillantemente - grazie molte. L'unico problema è che la seconda parte (inversione/trasposizione) fallisce per nomi come "Ben Gaied N", ma non l'ho chiesto esplicitamente, e sono sicuro di poterlo risolvere. – Tomba

+1

@Tomba l'espressione regolare scambia le parole al primo spazio bianco. Usa '/ (. +) \ S + (\ S +) /' per scambiare all'ultimo spazio bianco. – Amarghosh

8

Usa join per combinare i valori nella matrice.

var myJoinedString = myArray.join(','); 
2
var myArray = ['Hill M','Zhang F','Dong L', 'Wilkinson JS', 'Harris N']; 
var replaced = myArray.map(function(elem) { 
    return elem.replace(/(\S+)\s+(\S+)/, "$2 $1"); 
}); 
var last = replaced.pop() 
var result = replaced.join(", ") + " and " + last; 

alert(result) 
+0

Nice, ma potresti voler usare '/^(.*?)\s+(\S+)$'/ per la tua espressione invece –

2

Prova questo:

if (myArray.length <= 1) { 
    str = myArray.join(); 
} else { 
    str = myArray.slice(0, -1).join(", ") + " and " + myArray[myArray.length-1]; 
} 

E per il vostro parte lo scambio:

myArray.map(function(val) { return val.split(" ").reverse().join(" "); }) 
Problemi correlati