2010-03-03 17 views
5

Disculpas por esta pregunta embarazosamente simple, pero todavía soy relativamente nuevo en javascript.Convertir matriz en texto delimitado por comas

tengo una matriz de nombres, algo así como

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

me gustaría devolver una cadena, con nombres separados por comas, pero con "y" entre los dos últimos nombres, es decir,

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

¿Cuál es la forma más eficiente de hacer esto en javascript?

¿Qué tal si quería incorporar los nombres e iniciales, es decir, para volver

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

Respuesta

19

Array::slice() Selecciona una parte de una matriz, y devuelve la nueva matriz.
Array::join() Une todos los elementos de una matriz en una cadena
String::concat() Concatena dos o más cadenas.

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 

para cambiar su orden:

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 

En caso de que se preguntan acerca str.replace(/^(\S+)\s+(.+)$/, '$2 $1');

/^(\S+)\s+(.+)$/ es una expresión regular que coincide con una cadena que:

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

$1 y $2 En t La cadena de reemplazo representa los grupos primero y segundo (subpatrones encerrados entre paréntesis) de la expresión regular.

+1

Es bueno, sino dar alguna explicación, tal vez? OP dijo que era nuevo en js. –

+0

Eso funciona de manera brillante, muchas gracias. El único pequeño problema es que la segunda parte (reversión/transposición) falla para nombres como "Ben Gaied N", pero no pregunté explícitamente sobre eso, y estoy seguro de que puedo resolverlo. – Tomba

+1

@Tomba the regex actualmente intercambia las palabras en el primer espacio en blanco. Use '/ (. +) \ S + (\ S +) /' para intercambiar en el último espacio en blanco. – Amarghosh

8

Uso join para combinar los valores de la matriz.

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

Bueno, pero es posible que desee utilizar '/^(.*?)\s+(\S+)$'/ para su expresión en su lugar –

2

Prueba esto:

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

Y para su parte de intercambio:

myArray.map(function(val) { return val.split(" ").reverse().join(" "); }) 
Cuestiones relacionadas