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

前端 未结 11 798
灰色年华
灰色年华 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:00
    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 讨论(0)
  • 2021-02-03 18:00

    Though its a late answer, adding some approaches.

    Method 1: Using Array.splice() add the last delimiter before last element and join and remove the last two ,.

    function join(arr,last)
    {
        if(!Array.isArray(arr)) throw "Passed value is not of array type.";
        last = last || ' and '; //set 'and' as default
        
        (arr.length>1 && arr.splice(-1,0,last));
        arr = arr.join().split("");
        arr[arr.lastIndexOf(",")]="";
        arr[arr.lastIndexOf(",")]="";
        return arr.join("");
    }
    
    console.log( join([1]) ); //single valued array
    console.log( join([1,2]) ); //double valued array
    console.log( join([1,2,3]) ); //more than 2 values array,
    console.log( join([1,2,3],' or ') ); //with custom last delimiter
    console.log( join("name") ); //Non-array type

    Method 2: Using Array.reduce() to construct the string by traversing each element.

    function join(arr,last)
    {
        if(!Array.isArray(arr)) throw "Passed value is not of array type.";
        last=last||' and ';
        
        return arr.reduce(function(acc,value,index){
            if(arr.length<2) return arr.join();
            return acc + (index>=arr.length-2 ? index>arr.length-2 ? value : value+last : value+",");
        },"");
    }
    
    console.log( join([1]) ); //single valued array
    console.log( join([1,2]) ); //double valued array
    console.log( join([1,2,3]) ); //more than 2 values array,
    console.log( join([1,2,3,4],' or ') ); //with custom last delimiter
    console.log( join("name") ); //Non-array type

    0 讨论(0)
  • 2021-02-03 18:00
    function getValuesfromArray(strArray) {
      let endString = "";
    
      if (strArray.length > 1) {
        const lastEntry = strArray.pop();
        endString = strArray.join(", ") + " or " + lastEntry;
      }
      else {
        endString = strArray.toString();
      }
    
      return endString;
    }
    
    0 讨论(0)
  • 2021-02-03 18:03

    compact version :)

    function customJoin(arr,s1,s2){
    return(arr.slice(0,-1).join(s1).concat(arr.length > 1 ? s2 : '', arr.slice(-1)));
    }
    

    /* 
    arr: data array
    s1: regular seperator (string)
    s2: last seperator (string)
    */
    
    function customJoin(arr,s1,s2){
    return(arr.slice(0,-1).join(s1).concat(arr.length > 1 ? s2 : '', arr.slice(-1)));
    }
    
    let arr1 = ['a','b','c','d'];
    let arr2 = ['singleToken'];
    
    console.log(customJoin(arr1,',',' and '));
    //expected: 'a,b,c and d'
    console.log(customJoin(arr1,'::',' and finally::'));
    //expected: 'a::b::c and finally::d'
    console.log(customJoin(arr2,',','and '));
    //expected: 'singleToken'

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

    Building off of @dystroy's answer:

    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;
    }
    

    Example usages:

    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 讨论(0)
  • 2021-02-03 18:07

    For me the simplest solution is:

    ['1', '2', '3'].reduce((previous, current, index, array) => {
        if (index === array.length - 1) {
            return previous + ' & ' + current;
        } else {
            return previous + ', ' + current;
        }
    })
    
    0 讨论(0)
提交回复
热议问题