2013-12-07 2 views
-3

У вас есть строки с символом-разделителем (пробел или что-то другое), как следующее:Составьте список запятая и «и» -разделенное

"1 2 3" 
"1 2" 
"1" 

Что такое лучший/элегантный способ в JavaScript, чтобы форматировать их следующим образом?

"1, 2 and 3" 
"1 and 2" 
"1" 

Must работает для любого числа элементов> = 1

+1

Пожалуйста A) перефразировать ваш вопрос о включении * вопрос * в теле, вместо названия, B) исправить орфографические ошибки, и C) предоставить пример кода того, что вы хотите видеть. – brandonscript

+0

var mystring = "1 2 3"; var splitArr = mystring.split (""); var finalString = "" для (var i = 0; i jm0

+0

Не знаете, почему это было приостановлено. Это не сложно само по себе, но это была повторяющаяся достаточно задача, которую я хотел бы видеть отвлеченной и обобщенной для повторного использования. –

ответ

0

Это один работает, если у вас есть массив тоже. Он использует Query $ .inArray, который можно опустить, если вы не используете jQuery и не вводите его только в форме массива или в форме строки.

// Transform a string made of substrings separated by a separator (default "#") 
    // or an array in a string that is comma (", ") separated and that has an "and" 
    // separaing the last element. 
    // Ex: 
    //  toCommaAnd("1#2#3")  -> "1, 2 and 3" 
    //  toCommaAnd("1 2 3"," ") -> "1, 2 and 3" 
    //  toCommaAnd("Mr. Cinelli#Ms. Cinelli") ->"Mr. Cinelli and Ms. Cinelli" 
    //  toCommaAnd(["a", "b"]) -> "a and b" 
    // 
    // !! toCommaAnd("1#2#3#") -> become "1, 2 and 3" TOO so you can 
    //         concatenate elements in loops without 
    //         caring about special case for first or 
    //         last element. 


    function toCommaAnd(str, separator) { 
     var ar = $.isArray(str) ? str : str.split(separator || "#"), 
      commaUntil = ar.length - 1, 
      ret = ar[0], 
      i; 

     //This is just for the 1#2#3# cases. 
     if (commaUntil > 0 && ar[commaUntil] === ""){ 
      commaUntil--; 
     } 

     for (i = 1; i < commaUntil; i++){ 
      ret += ", " + ar[i]; 
     } 
     if (commaUntil > 0) 
      ret += " and " + ar[commaUntil]; 

     return ret ; 
    }, 
0

Вы можете использовать это:

<!DOCTYPE html> 
<html> 
<body> 
<script> 
cars=["Elem 1","Elem 2","Elem 3","Elem 4"]; 
var s = ''; 
var sep = ''; 
for (var i=0;i<cars.length;i++) 
{ 
    if(i==cars.length-1){ 
    s=s+" and "+cars[i]; 
    }else{ 
    s=s+sep+cars[i]; 
    sep = ', '; 
    } 
} 
document.write(s + "<br>"); 
</script> 
</body> 
</html> 
1

Got это где-то на StackOverflow несколько лет назад. Это очень простая реализация - нетрудно добавить параметр ограничителя к методу.

function formatList(myString){ 
     if (myString.indexOf(" ") === -1) return myString; 

     if (myString.indexOf(" ") === myString.lastIndexOf(" ")){ 
      return myString.replace(" ", " and "); 
     } 

     var former = myString.substr(0, myString.lastIndexOf(" ")); 
      former = former.replace(/ /g,", "); 

     var latter = myString.substr(myString.lastIndexOf(" "), myString.length -1); 
     var output = former + " and " + latter; 

     return output; 
    } 

formatList("1"); // 1 
formatList("1 2"); // 1 and 2 
formatList("1 2 3"); // 1, 2 and 3 
formatList("1 2 3 4"); // 1, 2, 3 and 4 
2

Основной раствор:

function format(input, separator) { 
    if (!input) return input; 
    input = input.split(separator || ' '); 
    if (input.length === 1) return input[0]; 
    return input.slice(0, -1).join(', ') + ' and ' + input.pop(); 
} 

Это один прилипает к вашему собственному подходу (задний разделитель): Пример

function format(input, separator) { 
    var save = input, pattern; 
    if (!input) return input; 
    pattern = '[^\\' + (separator || ' ') + ']+'; 
    input = input.match(new RegExp(pattern, 'g')); 
    if (!input) return save; 
    if (input.length === 1) return input[0]; 
    return input.slice(0, -1).join(', ') + ' and ' + input.pop(); 
} 

Использование:

format('1)))2(3)4))', ')'); // "1, 2(3 and 4" 
+0

Спасибо за upvote Андреас, но, пожалуйста, не калеча мое сообщение снова! – leaf

0

Это одно довольно скрученный:

function format(input, separator) { 
    var idx = input.indexOf(separator || ' '); 
    if (idx === -1) return input; 
    return input.substring(0, idx++) + (
     input.indexOf(separator || ' ', idx) === -1 ? ' and ' : ', ' 
    ) + (
     format(input.slice(idx), separator) 
    ); 
} 

Не удается обработать последовательные и завершающих разделителей, хотя:

format('1|2||3|', '|'); // "1, 2, , 3 and " 
Смежные вопросы