Convert string parameter to an array of one element












15














I wrote a function which has to support two types of a paramter names for a list of values. Internally it deals with the parameter as an array.



A single name is given as string and multiples names are given as an array of strings.



// simplified example
let doSome = names => names.map(name => name.toUpperCase())

names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function


I found a solution using Array.of() in combination with flatten() which needs some babel configuration.



doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());


Is there an idiomatic way in JavaScript to get an array without a type check?










share|improve this question
























  • I think you may use split() to convert a string in to array of one element
    – Manikanta Chinta
    yesterday






  • 6




    Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
    – shiftweave
    yesterday






  • 1




    @shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
    – Mike Hill
    yesterday










  • Why can't you just (names instanceof Array ? names : [names]).map()?
    – Salman A
    23 hours ago
















15














I wrote a function which has to support two types of a paramter names for a list of values. Internally it deals with the parameter as an array.



A single name is given as string and multiples names are given as an array of strings.



// simplified example
let doSome = names => names.map(name => name.toUpperCase())

names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function


I found a solution using Array.of() in combination with flatten() which needs some babel configuration.



doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());


Is there an idiomatic way in JavaScript to get an array without a type check?










share|improve this question
























  • I think you may use split() to convert a string in to array of one element
    – Manikanta Chinta
    yesterday






  • 6




    Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
    – shiftweave
    yesterday






  • 1




    @shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
    – Mike Hill
    yesterday










  • Why can't you just (names instanceof Array ? names : [names]).map()?
    – Salman A
    23 hours ago














15












15








15


1





I wrote a function which has to support two types of a paramter names for a list of values. Internally it deals with the parameter as an array.



A single name is given as string and multiples names are given as an array of strings.



// simplified example
let doSome = names => names.map(name => name.toUpperCase())

names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function


I found a solution using Array.of() in combination with flatten() which needs some babel configuration.



doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());


Is there an idiomatic way in JavaScript to get an array without a type check?










share|improve this question















I wrote a function which has to support two types of a paramter names for a list of values. Internally it deals with the parameter as an array.



A single name is given as string and multiples names are given as an array of strings.



// simplified example
let doSome = names => names.map(name => name.toUpperCase())

names(['Bart', 'Lisa'])
// [ 'BART', 'LISA' ]
names('Homer')
// TypeError: names.map is not a function


I found a solution using Array.of() in combination with flatten() which needs some babel configuration.



doSome = names => Array.of(names).flatten().map(name => name.toUpperCase());


Is there an idiomatic way in JavaScript to get an array without a type check?







javascript arrays string ecmascript-6






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 14 hours ago









4dc0

42739




42739










asked yesterday









sschmeck

3,1091937




3,1091937












  • I think you may use split() to convert a string in to array of one element
    – Manikanta Chinta
    yesterday






  • 6




    Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
    – shiftweave
    yesterday






  • 1




    @shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
    – Mike Hill
    yesterday










  • Why can't you just (names instanceof Array ? names : [names]).map()?
    – Salman A
    23 hours ago


















  • I think you may use split() to convert a string in to array of one element
    – Manikanta Chinta
    yesterday






  • 6




    Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
    – shiftweave
    yesterday






  • 1




    @shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
    – Mike Hill
    yesterday










  • Why can't you just (names instanceof Array ? names : [names]).map()?
    – Salman A
    23 hours ago
















I think you may use split() to convert a string in to array of one element
– Manikanta Chinta
yesterday




I think you may use split() to convert a string in to array of one element
– Manikanta Chinta
yesterday




6




6




Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
– shiftweave
yesterday




Why don't you want to use a type-check? That would typically be the idiomatic and maintainable way to do this.
– shiftweave
yesterday




1




1




@shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
– Mike Hill
yesterday




@shiftweave +1. As the current responses show, the ways around this simply hide the type-check underneath another call and shift into the code-monkeying realm (or make it so that the method must be called with a variable number of parameters). The type check is the most idiomatic solution.
– Mike Hill
yesterday












Why can't you just (names instanceof Array ? names : [names]).map()?
– Salman A
23 hours ago




Why can't you just (names instanceof Array ? names : [names]).map()?
– Salman A
23 hours ago












3 Answers
3






active

oldest

votes


















25














You can use Array.concat(), since concat accepts both arrays and non arrays:






const names = (v) => .concat(v).map(name => name.toUpperCase())

console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
console.log(names('Homer')) // ['HOMER']








share|improve this answer





















  • The type check is now hidden away in Array.prototype.concat()...
    – Eric Duminil
    yesterday



















2














You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.



It means you can call the function as names('Homer') or names('Bart', 'Lisa'):






function names(...args){
return args.map(name => name.toUpperCase());
}

console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
console.log(names('Homer')); // ['HOMER']





If you really want to call the function with an array as argument, you can use the spread syntax :



console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]


If you use it with a string, you'll get back an array of characters, though:



console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]





share|improve this answer





























    0














    Maybe an maybe upcomming method of Array#flat would help in this case (works actually only in Chrome and FF).






    const names = unknown => [unknown].flat().map(name => name.toUpperCase())

    console.log(names(['Bart', 'Lisa']));
    console.log(names('Homer'));








    share|improve this answer





















    • This answer is identical to the solution OP wants to improve, but using a different polyfill.
      – shiftweave
      yesterday








    • 1




      @shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaring Array.of.
      – Konrad Rudolph
      yesterday











    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54039152%2fconvert-string-parameter-to-an-array-of-one-element%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    25














    You can use Array.concat(), since concat accepts both arrays and non arrays:






    const names = (v) => .concat(v).map(name => name.toUpperCase())

    console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
    console.log(names('Homer')) // ['HOMER']








    share|improve this answer





















    • The type check is now hidden away in Array.prototype.concat()...
      – Eric Duminil
      yesterday
















    25














    You can use Array.concat(), since concat accepts both arrays and non arrays:






    const names = (v) => .concat(v).map(name => name.toUpperCase())

    console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
    console.log(names('Homer')) // ['HOMER']








    share|improve this answer





















    • The type check is now hidden away in Array.prototype.concat()...
      – Eric Duminil
      yesterday














    25












    25








    25






    You can use Array.concat(), since concat accepts both arrays and non arrays:






    const names = (v) => .concat(v).map(name => name.toUpperCase())

    console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
    console.log(names('Homer')) // ['HOMER']








    share|improve this answer












    You can use Array.concat(), since concat accepts both arrays and non arrays:






    const names = (v) => .concat(v).map(name => name.toUpperCase())

    console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
    console.log(names('Homer')) // ['HOMER']








    const names = (v) => .concat(v).map(name => name.toUpperCase())

    console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
    console.log(names('Homer')) // ['HOMER']





    const names = (v) => .concat(v).map(name => name.toUpperCase())

    console.log(names(['Bart', 'Lisa'])) // [ 'BART', 'LISA' ]
    console.log(names('Homer')) // ['HOMER']






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered yesterday









    Ori Drori

    74.1k127892




    74.1k127892












    • The type check is now hidden away in Array.prototype.concat()...
      – Eric Duminil
      yesterday


















    • The type check is now hidden away in Array.prototype.concat()...
      – Eric Duminil
      yesterday
















    The type check is now hidden away in Array.prototype.concat()...
    – Eric Duminil
    yesterday




    The type check is now hidden away in Array.prototype.concat()...
    – Eric Duminil
    yesterday













    2














    You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.



    It means you can call the function as names('Homer') or names('Bart', 'Lisa'):






    function names(...args){
    return args.map(name => name.toUpperCase());
    }

    console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
    console.log(names('Homer')); // ['HOMER']





    If you really want to call the function with an array as argument, you can use the spread syntax :



    console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]


    If you use it with a string, you'll get back an array of characters, though:



    console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]





    share|improve this answer


























      2














      You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.



      It means you can call the function as names('Homer') or names('Bart', 'Lisa'):






      function names(...args){
      return args.map(name => name.toUpperCase());
      }

      console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
      console.log(names('Homer')); // ['HOMER']





      If you really want to call the function with an array as argument, you can use the spread syntax :



      console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]


      If you use it with a string, you'll get back an array of characters, though:



      console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]





      share|improve this answer
























        2












        2








        2






        You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.



        It means you can call the function as names('Homer') or names('Bart', 'Lisa'):






        function names(...args){
        return args.map(name => name.toUpperCase());
        }

        console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
        console.log(names('Homer')); // ['HOMER']





        If you really want to call the function with an array as argument, you can use the spread syntax :



        console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]


        If you use it with a string, you'll get back an array of characters, though:



        console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]





        share|improve this answer












        You might not be able to implement it this way if you already have code depending on this function. Still, it would probably be cleaner to allow your function to accept a variable number of arguments with rest parameters.



        It means you can call the function as names('Homer') or names('Bart', 'Lisa'):






        function names(...args){
        return args.map(name => name.toUpperCase());
        }

        console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
        console.log(names('Homer')); // ['HOMER']





        If you really want to call the function with an array as argument, you can use the spread syntax :



        console.log(names(...['Bart', 'Lisa'])); // [ "BART", "LISA" ]


        If you use it with a string, you'll get back an array of characters, though:



        console.log(names(...'Homer')); // [ "H", "O", "M", "E", "R" ]





        function names(...args){
        return args.map(name => name.toUpperCase());
        }

        console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
        console.log(names('Homer')); // ['HOMER']





        function names(...args){
        return args.map(name => name.toUpperCase());
        }

        console.log(names('Bart', 'Lisa')); // [ 'BART', 'LISA' ]
        console.log(names('Homer')); // ['HOMER']






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered yesterday









        Eric Duminil

        39.3k53068




        39.3k53068























            0














            Maybe an maybe upcomming method of Array#flat would help in this case (works actually only in Chrome and FF).






            const names = unknown => [unknown].flat().map(name => name.toUpperCase())

            console.log(names(['Bart', 'Lisa']));
            console.log(names('Homer'));








            share|improve this answer





















            • This answer is identical to the solution OP wants to improve, but using a different polyfill.
              – shiftweave
              yesterday








            • 1




              @shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaring Array.of.
              – Konrad Rudolph
              yesterday
















            0














            Maybe an maybe upcomming method of Array#flat would help in this case (works actually only in Chrome and FF).






            const names = unknown => [unknown].flat().map(name => name.toUpperCase())

            console.log(names(['Bart', 'Lisa']));
            console.log(names('Homer'));








            share|improve this answer





















            • This answer is identical to the solution OP wants to improve, but using a different polyfill.
              – shiftweave
              yesterday








            • 1




              @shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaring Array.of.
              – Konrad Rudolph
              yesterday














            0












            0








            0






            Maybe an maybe upcomming method of Array#flat would help in this case (works actually only in Chrome and FF).






            const names = unknown => [unknown].flat().map(name => name.toUpperCase())

            console.log(names(['Bart', 'Lisa']));
            console.log(names('Homer'));








            share|improve this answer












            Maybe an maybe upcomming method of Array#flat would help in this case (works actually only in Chrome and FF).






            const names = unknown => [unknown].flat().map(name => name.toUpperCase())

            console.log(names(['Bart', 'Lisa']));
            console.log(names('Homer'));








            const names = unknown => [unknown].flat().map(name => name.toUpperCase())

            console.log(names(['Bart', 'Lisa']));
            console.log(names('Homer'));





            const names = unknown => [unknown].flat().map(name => name.toUpperCase())

            console.log(names(['Bart', 'Lisa']));
            console.log(names('Homer'));






            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered yesterday









            Nina Scholz

            177k1390155




            177k1390155












            • This answer is identical to the solution OP wants to improve, but using a different polyfill.
              – shiftweave
              yesterday








            • 1




              @shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaring Array.of.
              – Konrad Rudolph
              yesterday


















            • This answer is identical to the solution OP wants to improve, but using a different polyfill.
              – shiftweave
              yesterday








            • 1




              @shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaring Array.of.
              – Konrad Rudolph
              yesterday
















            This answer is identical to the solution OP wants to improve, but using a different polyfill.
            – shiftweave
            yesterday






            This answer is identical to the solution OP wants to improve, but using a different polyfill.
            – shiftweave
            yesterday






            1




            1




            @shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaring Array.of.
            – Konrad Rudolph
            yesterday




            @shiftweave I see at least two differences: (1) it already works natively in some implementations; (2) it arguably improves the syntax of OP’s code by sugaring Array.of.
            – Konrad Rudolph
            yesterday


















            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54039152%2fconvert-string-parameter-to-an-array-of-one-element%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            An IMO inspired problem

            Management

            Has there ever been an instance of an active nuclear power plant within or near a war zone?