Преобразовать массив в текст с разделителями-запятыми - PullRequest
5 голосов
/ 03 марта 2010

Извиняюсь за этот смущающе простой вопрос, но я все еще относительно новичок в javascript.

У меня есть массив имен, что-то вроде

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

Я хотел бы вернуть строку с именами, разделенными запятыми, но с "и" между двумя последними именами, т.е.

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

Какой самый эффективный способ сделать это в JavaScript?

Как насчет того, чтобы я хотел транспонировать имена и инициалы, то есть вернуть

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

Ответы [ 4 ]

19 голосов
/ 03 марта 2010

Array :: slice () Выбирает часть массива и возвращает новый массив.
Array :: join () Объединяет все элементы массива в строку
String :: concat () Объединяет две или более строки.

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

Чтобы изменить их порядок:

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

В случае, если вам интересно о str.replace(/^(\S+)\s+(.+)$/, '$2 $1');

/^(\S+)\s+(.+)$/ - это регулярное выражение, соответствующее строке, которая:

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

$1 и $2 в строке замены означают 1-ю и 2-ю группы (подшаблоны, заключенные в скобки) из регулярного выражения.

8 голосов
/ 03 марта 2010

Используйте объединение для объединения значений в массиве.

var myJoinedString = myArray.join(',');
2 голосов
/ 03 марта 2010

Попробуйте это:

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

А для вашей подкачки:

myArray.map(function(val) { return val.split(" ").reverse().join(" "); })
2 голосов
/ 03 марта 2010
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...