2013-02-25 8 views
12

To, czego chcę, to coś w rodzaju Array.join(separator), ale drugi argument to Array.join(separator, beforeLastElement), więc gdy powiem [foo, bar, baz].join(", ", " or"), otrzymam "foo, bar or baz". Sądzę, że mógłbym napisać funkcję, która użyłaby Array.slice do oddzielenia ostatniego elementu, ale czy jest tam jakaś dobrze znana metoda, którą mógłbym zamiast tego użyć?Czy istnieje sposób łączenia elementów w tablicy js, ale czy ostatni separator powinien być inny?

Odpowiedz

6

Nie, jest to wystarczająco specyficzne, że trzeba będzie napisać funkcję niestandardową. Dobra wiadomość jest taka, jak powiedziałeś, kiedy użyjesz Array.join, aby zająć się wszystkimi separatorami, ostatnia będzie łatwa do zaktualizowania.

23

Czy na pewno funkcja powinna być wcześniej zdefiniowana?

var a = ['a', 'b', 'c']; 
var str = a.slice(0, -1).join(',')+' or '+a.slice(-1); 
+1

Należy pamiętać, że zakłada to "a.length> 1". Powinieneś również pokryć 'a.length <= 1' –

+0

Nie jestem pewien, czy powinienem, po prostu zastanawiałem się, czy istnieje, a jeśli nie, to czy jest jakiś uzgodniony sposób robienia tego. Głupotą byłoby pisać coś innego niż wszyscy inni. –

11

budynku off odpowiedzi @ dystroy za:

function formatArray(arr){ 
    var outStr = ""; 
    if (arr.length === 1) { 
     outStr = arr[0]; 
    } else if (arr.length === 2) { 
     //joins all with "and" but no commas 
     //example: "bob and sam" 
     outStr = arr.join(' and '); 
    } else if (arr.length > 2) { 
     //joins all with commas, but last one gets ", and" (oxford comma!) 
     //example: "bob, joe, and sam" 
     outStr = arr.slice(0, -1).join(', ') + ', and ' + arr.slice(-1); 
    } 
    return outStr; 
} 

Przykład zwyczaje:

formatArray([]);    //"" 
formatArray(["a"]);    //"a" 
formatArray(["a","b"]);   //"a and b" 
formatArray(["a","b","c"]);  //"a, b, and c" 
formatArray(["a","b","c","d"]); //"a, b, c, and d" 
+0

Świetnie! Jednak mały błąd w linii 'outStr = arr.slice (0, -1) .join (',') + 'i' + arr.slice (-1);' Umieść spację po przecinku wewnątrz 'join () ' –

+1

@AndyB oops, tak, masz rację. Dodałem teraz miejsce. Dzięki! –

+0

Działa jak urok. :) –

4
Array.prototype.join2 = function(all, last) { 
    var arr = this.slice();     //make a copy so we don't mess with the original 
    var lastItem = arr.splice(-1);   //strip out the last element 
    arr = arr.length ? [arr.join(all)] : []; //make an array with the non-last elements joined with our 'all' string, or make an empty array 
    arr.push(lastItem);      //add last item back so we should have ["some string with first stuff split by 'all'", last item]; or we'll just have [lastItem] if there was only one item, or we'll have [] if there was nothing in the original array 
    return arr.join(last);     //now we join the array with 'last' 
} 

> [1,2,3,4].join2(', ', ' and '); 
>> "1, 2, 3 and 4" 
0

Dla nodejswebpack i inne bundlers użytkowników: istnieje pakiet join-array

const join = require('join-array'); 
const names = ['Rachel','Taylor','Julia','Robert','Jasmine','Lily','Madison']; 
const config = { 
    array: names, 
    separator: ', ', 
    last: ' and ', 
    max: 4, 
    maxMessage:(missed)=>`(${missed} more...)` 
}; 
const list = join(config); //Rachel, Taylor, Julia, (3 more...) and Madison 
Powiązane problemy