Is there a way to join the elements in an js array, but let the last separator be different?

前端 未结 11 799
灰色年华
灰色年华 2021-02-03 17:40

What I want is something like Array.join(separator), but which takes a second argument Array.join(separator, beforeLastElement), so when I say [f

相关标签:
11条回答
  • 2021-02-03 18:08

    there is a package 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
    
    0 讨论(0)
  • 2021-02-03 18:11

    May I suggest:

    ['tom', 'dick', 'harry'].join(', ').replace(/, ([^,]*)$/, ' and $1')
    > "tom, dick and harry"
    
    0 讨论(0)
  • 2021-02-03 18:14

    There's no predefined function, because it's quite simple.

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

    There's also a specification problem for the main use case of such a function which is natural language formatting. For example if we were to use the Oxford comma logic we would have a different result than what you're looking for:

    // make a list in the Oxford comma style (eg "a, b, c, and d")
    // Examples with conjunction "and":
    // ["a"] -> "a"
    // ["a", "b"] -> "a and b"
    // ["a", "b", "c"] -> "a, b, and c"
    exports.oxford = function(arr, conjunction, ifempty){
        let l = arr.length;
        if (!l) return ifempty;
        if (l<2) return arr[0];
        if (l<3) return arr.join(` ${conjunction} `);
        arr = arr.slice();
        arr[l-1] = `${conjunction} ${arr[l-1]}`;
        return arr.join(", ");
    }
    

    So it seems better to let this problem in userland.

    0 讨论(0)
  • 2021-02-03 18:15

    No, this is specific enough that you will have to write a custom function. The good news is, as you said, once you use Array.join to take care of all the separators, the last one will be easy enough to update.

    0 讨论(0)
  • 2021-02-03 18:15

    In-line solution using reduce:

    [1, 2, 3, 4, 5].reduce((text, value, i, array) => text + (i < array.length - 1 ? ', ' : ' or ') + value);
    
    => 1, 2, 3, 4 or 5"
    
    0 讨论(0)
提交回复
热议问题