cropping a message using array splitsSimplify code using arrayMilliseconds to Time string & Time string to MillisecondsSlideshow by array using slice methodDefinitional Returns. Solved. MostlyA String.prototype.diff() implementation (text diff)Using promise all with push arraySmall JavaScript library for ECMAScript version detectionThis macro will convert you… or notReturns Google Sheet cells from a named rangeImporting text into PANDAS and counting certain words

Has there been evidence of any other gods?

Is it nonsense to say B -> [A -> B]?

When do you stop "pushing" a book?

Series that evaluates to different values upon changing order of summation

is it permitted to swallow spit on a fast day?

Why was wildfire not used during the Battle of Winterfell?

Renting a house to a graduate student in my department

Extending Kan fibrations, without using minimal fibrations

Is every story set in the future "science fiction"?

Why can't I prove summation identities without guessing?

How is CoreiX like Corei5, i7 is related to Haswell, Ivy Bridge?

Would encrypting a database protect against a compromised admin account?

How to make a language evolve quickly?

We are two immediate neighbors who forged our own powers to form concatenated relationship. Who are we?

Passport stamps art, can it be done?

Two researchers want to work on the same extension to my paper. Who to help?

What was the plan for an abort of the Enola Gay's mission to drop the atomic bomb?

Company stopped paying my salary. What are my options?

What's the difference between const array and static const array in C/C++

Is it a Munchausen Number?

Is it a good idea to copy a trader when investing?

Why do unstable nuclei form?

Why does it take longer to fly from London to Xi'an than to Beijing

How to select certain lines (n, n+4, n+8, n+12...) from the file?



cropping a message using array splits


Simplify code using arrayMilliseconds to Time string & Time string to MillisecondsSlideshow by array using slice methodDefinitional Returns. Solved. MostlyA String.prototype.diff() implementation (text diff)Using promise all with push arraySmall JavaScript library for ECMAScript version detectionThis macro will convert you… or notReturns Google Sheet cells from a named rangeImporting text into PANDAS and counting certain words






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty margin-bottom:0;








3












$begingroup$


I am trying to write a simple function to crop a given message to a specific length but at the same time not to cut the words in between and no trailing spaces in the end.



Example:



Input String: The quick brown fox jumped over the fence, K: 11



Output: The quick



Here is what I have tried:



 function crop(message, K) 
var originalLen = message.length;
if(originalLen<K)

return message;

else

var words = message.split(' '),substr;

for(var i=words.length;i > 0;i--)


words.pop();

if(words.join(' ').length<=K)

return words.join(' ');








This function works fine but I am not very happy with the implementation. Need suggestions on the performance aspects and will there be a case where this won't work?










share|improve this question









$endgroup$


















    3












    $begingroup$


    I am trying to write a simple function to crop a given message to a specific length but at the same time not to cut the words in between and no trailing spaces in the end.



    Example:



    Input String: The quick brown fox jumped over the fence, K: 11



    Output: The quick



    Here is what I have tried:



     function crop(message, K) 
    var originalLen = message.length;
    if(originalLen<K)

    return message;

    else

    var words = message.split(' '),substr;

    for(var i=words.length;i > 0;i--)


    words.pop();

    if(words.join(' ').length<=K)

    return words.join(' ');








    This function works fine but I am not very happy with the implementation. Need suggestions on the performance aspects and will there be a case where this won't work?










    share|improve this question









    $endgroup$














      3












      3








      3





      $begingroup$


      I am trying to write a simple function to crop a given message to a specific length but at the same time not to cut the words in between and no trailing spaces in the end.



      Example:



      Input String: The quick brown fox jumped over the fence, K: 11



      Output: The quick



      Here is what I have tried:



       function crop(message, K) 
      var originalLen = message.length;
      if(originalLen<K)

      return message;

      else

      var words = message.split(' '),substr;

      for(var i=words.length;i > 0;i--)


      words.pop();

      if(words.join(' ').length<=K)

      return words.join(' ');








      This function works fine but I am not very happy with the implementation. Need suggestions on the performance aspects and will there be a case where this won't work?










      share|improve this question









      $endgroup$




      I am trying to write a simple function to crop a given message to a specific length but at the same time not to cut the words in between and no trailing spaces in the end.



      Example:



      Input String: The quick brown fox jumped over the fence, K: 11



      Output: The quick



      Here is what I have tried:



       function crop(message, K) 
      var originalLen = message.length;
      if(originalLen<K)

      return message;

      else

      var words = message.split(' '),substr;

      for(var i=words.length;i > 0;i--)


      words.pop();

      if(words.join(' ').length<=K)

      return words.join(' ');








      This function works fine but I am not very happy with the implementation. Need suggestions on the performance aspects and will there be a case where this won't work?







      javascript performance array






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 4 hours ago









      beNerdbeNerd

      1273




      1273




















          3 Answers
          3






          active

          oldest

          votes


















          1












          $begingroup$

          This is much slower than necessary. It takes time to construct the array, and more to shorten the array word-by-word. It's easy to imagine how this would go if words contains a whole book and K is some small number.



          In general, you want an approach that inspects the original string to decide how much to keep, and then extracts that much, once, before returning it.



          A regular expression is an efficient and compact way to find text that meets your criteria. Consider:



          function crop(message, K) 


          .match returns an array with the matched text as the first element, or null if no match. The alternative [ "" ] will provide an empty string as a return value if there is no match (when the first word is longer than K).



          The regular expression, broken down, means:




          • ^: match start of string


          • .: followed by any character


          • 0,10: ... up to ten times (one less than K)


          • [^ ]: followed by a character that is not a space


          • (?=…): this is an assertion; it means the following expression must match, but is not included in the result:


            • : followed by a space


            • |: or


            • $: end-of-string


          Exercise: can you generalize this approach to recognize any kind of whitespace (tabs, newlines, and so on)?






          share|improve this answer









          $endgroup$




















            1












            $begingroup$

            Your code looks great.




            Oh My Goodness's solution is really great.





            If you wish, you might be able to design an expression that would do the entire process. I'm not so sure about my expression in this link, but it might give you an idea, how you may do so:



            ([A-z0-9s]1,11)(s)(.*)


            This expression is relaxed from the right and has three capturing groups with just a list of chars that I have just added in the first capturing group and I'm sure you might want to change that list.



            You may also want to add or reduce the boundaries.



            enter image description here



            Graph



            This graph shows how the expression would work and you can visualize other expressions in this link:



            enter image description here



            Performance Test



            This JavaScript snippet shows the performance of that expression using a simple 1-million times for loop.






            const repeat = 1000000;
            const start = Date.now();

            for (var i = repeat; i >= 0; i--)
            const string = 'The quick brown fox jumped over the fence';
            const regex = /([A-z0-9s]1,11)(s)(.*)/gm;
            var match = string.replace(regex, "$1");


            const end = Date.now() - start;
            console.log("YAAAY! "" + match + "" is a match 💚💚💚 ");
            console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. 😳 ");





            Testing Code






            const regex = /([A-z0-9s]1,11)(s)(.*)/s;
            const str = `The quick brown fox jumped over the fence`;
            const subst = `$1`;

            // The substituted value will be contained in the result variable
            const result = str.replace(regex, subst);

            console.log('Substitution result: ', result);








            share|improve this answer











            $endgroup$




















              0












              $begingroup$

              A Code Review



              Your code is a mess,



              • Inconsistent indenting.

              • Poor use of space between tokens, and operators.

              • Inappropriate use of variable declaration type let, var, const.

              • Contains irrelevant / unused code. eg substr

              Fails to meet requirements.



              You list the requirement




              "no trailing spaces in the end."




              Yet your code fails to do this in two ways



              When string is shorter than required length



               crop("trailing spaces ", 100); // returns "trailing spaces "


              When string contains 2 or more spaces near required length.



               crop("Trailing spaces strings with extra spaces", 17); // returns "Trailing spaces "


              Note: There are various white space characters not just the space. There are also special unicode characters the are visually 1 character (depending on device OS) yet take up 2 or more characters. eg "👨‍🚀".length === 5 is true. All JavaScript strings are Unicode.



              Rewrite



              Using the same logic (build return string from array of split words) the following example attempts to correct the style and adherence to the requirements.



              I prefer 4 space indentation (using spaces not tabs as tabs always seem to stuff up when copying between systems) however 2 spaces is acceptable (only by popularity)



              I assume that the message was converted from ASCII and spaces are the only white spaces of concern.



              function crop(message, maxLength) { // use meaningful names
              var result = message.trimEnd(); // Use var for function scoped variable
              if (result.length > maxLength) // space between if ( > and )
              const words = result.split(" "); // use const for variables that do not change
              do
              words.pop();
              result = words.join(" ").trimEnd(); // ensure no trailing spaces
              if (result.length <= maxLength) // not repeating same join operation
              break;

              while (words.length);

              return result;



              Note: Check runtime has String.trimEnd or use a polyfill or transpiler.






              share|improve this answer









              $endgroup$













                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: "196"
                ;
                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: false,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: null,
                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%2fcodereview.stackexchange.com%2fquestions%2f220011%2fcropping-a-message-using-array-splits%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









                1












                $begingroup$

                This is much slower than necessary. It takes time to construct the array, and more to shorten the array word-by-word. It's easy to imagine how this would go if words contains a whole book and K is some small number.



                In general, you want an approach that inspects the original string to decide how much to keep, and then extracts that much, once, before returning it.



                A regular expression is an efficient and compact way to find text that meets your criteria. Consider:



                function crop(message, K) 


                .match returns an array with the matched text as the first element, or null if no match. The alternative [ "" ] will provide an empty string as a return value if there is no match (when the first word is longer than K).



                The regular expression, broken down, means:




                • ^: match start of string


                • .: followed by any character


                • 0,10: ... up to ten times (one less than K)


                • [^ ]: followed by a character that is not a space


                • (?=…): this is an assertion; it means the following expression must match, but is not included in the result:


                  • : followed by a space


                  • |: or


                  • $: end-of-string


                Exercise: can you generalize this approach to recognize any kind of whitespace (tabs, newlines, and so on)?






                share|improve this answer









                $endgroup$

















                  1












                  $begingroup$

                  This is much slower than necessary. It takes time to construct the array, and more to shorten the array word-by-word. It's easy to imagine how this would go if words contains a whole book and K is some small number.



                  In general, you want an approach that inspects the original string to decide how much to keep, and then extracts that much, once, before returning it.



                  A regular expression is an efficient and compact way to find text that meets your criteria. Consider:



                  function crop(message, K) 


                  .match returns an array with the matched text as the first element, or null if no match. The alternative [ "" ] will provide an empty string as a return value if there is no match (when the first word is longer than K).



                  The regular expression, broken down, means:




                  • ^: match start of string


                  • .: followed by any character


                  • 0,10: ... up to ten times (one less than K)


                  • [^ ]: followed by a character that is not a space


                  • (?=…): this is an assertion; it means the following expression must match, but is not included in the result:


                    • : followed by a space


                    • |: or


                    • $: end-of-string


                  Exercise: can you generalize this approach to recognize any kind of whitespace (tabs, newlines, and so on)?






                  share|improve this answer









                  $endgroup$















                    1












                    1








                    1





                    $begingroup$

                    This is much slower than necessary. It takes time to construct the array, and more to shorten the array word-by-word. It's easy to imagine how this would go if words contains a whole book and K is some small number.



                    In general, you want an approach that inspects the original string to decide how much to keep, and then extracts that much, once, before returning it.



                    A regular expression is an efficient and compact way to find text that meets your criteria. Consider:



                    function crop(message, K) 


                    .match returns an array with the matched text as the first element, or null if no match. The alternative [ "" ] will provide an empty string as a return value if there is no match (when the first word is longer than K).



                    The regular expression, broken down, means:




                    • ^: match start of string


                    • .: followed by any character


                    • 0,10: ... up to ten times (one less than K)


                    • [^ ]: followed by a character that is not a space


                    • (?=…): this is an assertion; it means the following expression must match, but is not included in the result:


                      • : followed by a space


                      • |: or


                      • $: end-of-string


                    Exercise: can you generalize this approach to recognize any kind of whitespace (tabs, newlines, and so on)?






                    share|improve this answer









                    $endgroup$



                    This is much slower than necessary. It takes time to construct the array, and more to shorten the array word-by-word. It's easy to imagine how this would go if words contains a whole book and K is some small number.



                    In general, you want an approach that inspects the original string to decide how much to keep, and then extracts that much, once, before returning it.



                    A regular expression is an efficient and compact way to find text that meets your criteria. Consider:



                    function crop(message, K) 


                    .match returns an array with the matched text as the first element, or null if no match. The alternative [ "" ] will provide an empty string as a return value if there is no match (when the first word is longer than K).



                    The regular expression, broken down, means:




                    • ^: match start of string


                    • .: followed by any character


                    • 0,10: ... up to ten times (one less than K)


                    • [^ ]: followed by a character that is not a space


                    • (?=…): this is an assertion; it means the following expression must match, but is not included in the result:


                      • : followed by a space


                      • |: or


                      • $: end-of-string


                    Exercise: can you generalize this approach to recognize any kind of whitespace (tabs, newlines, and so on)?







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered 3 hours ago









                    Oh My GoodnessOh My Goodness

                    2,607315




                    2,607315























                        1












                        $begingroup$

                        Your code looks great.




                        Oh My Goodness's solution is really great.





                        If you wish, you might be able to design an expression that would do the entire process. I'm not so sure about my expression in this link, but it might give you an idea, how you may do so:



                        ([A-z0-9s]1,11)(s)(.*)


                        This expression is relaxed from the right and has three capturing groups with just a list of chars that I have just added in the first capturing group and I'm sure you might want to change that list.



                        You may also want to add or reduce the boundaries.



                        enter image description here



                        Graph



                        This graph shows how the expression would work and you can visualize other expressions in this link:



                        enter image description here



                        Performance Test



                        This JavaScript snippet shows the performance of that expression using a simple 1-million times for loop.






                        const repeat = 1000000;
                        const start = Date.now();

                        for (var i = repeat; i >= 0; i--)
                        const string = 'The quick brown fox jumped over the fence';
                        const regex = /([A-z0-9s]1,11)(s)(.*)/gm;
                        var match = string.replace(regex, "$1");


                        const end = Date.now() - start;
                        console.log("YAAAY! "" + match + "" is a match 💚💚💚 ");
                        console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. 😳 ");





                        Testing Code






                        const regex = /([A-z0-9s]1,11)(s)(.*)/s;
                        const str = `The quick brown fox jumped over the fence`;
                        const subst = `$1`;

                        // The substituted value will be contained in the result variable
                        const result = str.replace(regex, subst);

                        console.log('Substitution result: ', result);








                        share|improve this answer











                        $endgroup$

















                          1












                          $begingroup$

                          Your code looks great.




                          Oh My Goodness's solution is really great.





                          If you wish, you might be able to design an expression that would do the entire process. I'm not so sure about my expression in this link, but it might give you an idea, how you may do so:



                          ([A-z0-9s]1,11)(s)(.*)


                          This expression is relaxed from the right and has three capturing groups with just a list of chars that I have just added in the first capturing group and I'm sure you might want to change that list.



                          You may also want to add or reduce the boundaries.



                          enter image description here



                          Graph



                          This graph shows how the expression would work and you can visualize other expressions in this link:



                          enter image description here



                          Performance Test



                          This JavaScript snippet shows the performance of that expression using a simple 1-million times for loop.






                          const repeat = 1000000;
                          const start = Date.now();

                          for (var i = repeat; i >= 0; i--)
                          const string = 'The quick brown fox jumped over the fence';
                          const regex = /([A-z0-9s]1,11)(s)(.*)/gm;
                          var match = string.replace(regex, "$1");


                          const end = Date.now() - start;
                          console.log("YAAAY! "" + match + "" is a match 💚💚💚 ");
                          console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. 😳 ");





                          Testing Code






                          const regex = /([A-z0-9s]1,11)(s)(.*)/s;
                          const str = `The quick brown fox jumped over the fence`;
                          const subst = `$1`;

                          // The substituted value will be contained in the result variable
                          const result = str.replace(regex, subst);

                          console.log('Substitution result: ', result);








                          share|improve this answer











                          $endgroup$















                            1












                            1








                            1





                            $begingroup$

                            Your code looks great.




                            Oh My Goodness's solution is really great.





                            If you wish, you might be able to design an expression that would do the entire process. I'm not so sure about my expression in this link, but it might give you an idea, how you may do so:



                            ([A-z0-9s]1,11)(s)(.*)


                            This expression is relaxed from the right and has three capturing groups with just a list of chars that I have just added in the first capturing group and I'm sure you might want to change that list.



                            You may also want to add or reduce the boundaries.



                            enter image description here



                            Graph



                            This graph shows how the expression would work and you can visualize other expressions in this link:



                            enter image description here



                            Performance Test



                            This JavaScript snippet shows the performance of that expression using a simple 1-million times for loop.






                            const repeat = 1000000;
                            const start = Date.now();

                            for (var i = repeat; i >= 0; i--)
                            const string = 'The quick brown fox jumped over the fence';
                            const regex = /([A-z0-9s]1,11)(s)(.*)/gm;
                            var match = string.replace(regex, "$1");


                            const end = Date.now() - start;
                            console.log("YAAAY! "" + match + "" is a match 💚💚💚 ");
                            console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. 😳 ");





                            Testing Code






                            const regex = /([A-z0-9s]1,11)(s)(.*)/s;
                            const str = `The quick brown fox jumped over the fence`;
                            const subst = `$1`;

                            // The substituted value will be contained in the result variable
                            const result = str.replace(regex, subst);

                            console.log('Substitution result: ', result);








                            share|improve this answer











                            $endgroup$



                            Your code looks great.




                            Oh My Goodness's solution is really great.





                            If you wish, you might be able to design an expression that would do the entire process. I'm not so sure about my expression in this link, but it might give you an idea, how you may do so:



                            ([A-z0-9s]1,11)(s)(.*)


                            This expression is relaxed from the right and has three capturing groups with just a list of chars that I have just added in the first capturing group and I'm sure you might want to change that list.



                            You may also want to add or reduce the boundaries.



                            enter image description here



                            Graph



                            This graph shows how the expression would work and you can visualize other expressions in this link:



                            enter image description here



                            Performance Test



                            This JavaScript snippet shows the performance of that expression using a simple 1-million times for loop.






                            const repeat = 1000000;
                            const start = Date.now();

                            for (var i = repeat; i >= 0; i--)
                            const string = 'The quick brown fox jumped over the fence';
                            const regex = /([A-z0-9s]1,11)(s)(.*)/gm;
                            var match = string.replace(regex, "$1");


                            const end = Date.now() - start;
                            console.log("YAAAY! "" + match + "" is a match 💚💚💚 ");
                            console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. 😳 ");





                            Testing Code






                            const regex = /([A-z0-9s]1,11)(s)(.*)/s;
                            const str = `The quick brown fox jumped over the fence`;
                            const subst = `$1`;

                            // The substituted value will be contained in the result variable
                            const result = str.replace(regex, subst);

                            console.log('Substitution result: ', result);








                            const repeat = 1000000;
                            const start = Date.now();

                            for (var i = repeat; i >= 0; i--)
                            const string = 'The quick brown fox jumped over the fence';
                            const regex = /([A-z0-9s]1,11)(s)(.*)/gm;
                            var match = string.replace(regex, "$1");


                            const end = Date.now() - start;
                            console.log("YAAAY! "" + match + "" is a match 💚💚💚 ");
                            console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. 😳 ");





                            const repeat = 1000000;
                            const start = Date.now();

                            for (var i = repeat; i >= 0; i--)
                            const string = 'The quick brown fox jumped over the fence';
                            const regex = /([A-z0-9s]1,11)(s)(.*)/gm;
                            var match = string.replace(regex, "$1");


                            const end = Date.now() - start;
                            console.log("YAAAY! "" + match + "" is a match 💚💚💚 ");
                            console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. 😳 ");





                            const regex = /([A-z0-9s]1,11)(s)(.*)/s;
                            const str = `The quick brown fox jumped over the fence`;
                            const subst = `$1`;

                            // The substituted value will be contained in the result variable
                            const result = str.replace(regex, subst);

                            console.log('Substitution result: ', result);





                            const regex = /([A-z0-9s]1,11)(s)(.*)/s;
                            const str = `The quick brown fox jumped over the fence`;
                            const subst = `$1`;

                            // The substituted value will be contained in the result variable
                            const result = str.replace(regex, subst);

                            console.log('Substitution result: ', result);






                            share|improve this answer














                            share|improve this answer



                            share|improve this answer








                            edited 2 hours ago

























                            answered 2 hours ago









                            EmmaEmma

                            2351215




                            2351215





















                                0












                                $begingroup$

                                A Code Review



                                Your code is a mess,



                                • Inconsistent indenting.

                                • Poor use of space between tokens, and operators.

                                • Inappropriate use of variable declaration type let, var, const.

                                • Contains irrelevant / unused code. eg substr

                                Fails to meet requirements.



                                You list the requirement




                                "no trailing spaces in the end."




                                Yet your code fails to do this in two ways



                                When string is shorter than required length



                                 crop("trailing spaces ", 100); // returns "trailing spaces "


                                When string contains 2 or more spaces near required length.



                                 crop("Trailing spaces strings with extra spaces", 17); // returns "Trailing spaces "


                                Note: There are various white space characters not just the space. There are also special unicode characters the are visually 1 character (depending on device OS) yet take up 2 or more characters. eg "👨‍🚀".length === 5 is true. All JavaScript strings are Unicode.



                                Rewrite



                                Using the same logic (build return string from array of split words) the following example attempts to correct the style and adherence to the requirements.



                                I prefer 4 space indentation (using spaces not tabs as tabs always seem to stuff up when copying between systems) however 2 spaces is acceptable (only by popularity)



                                I assume that the message was converted from ASCII and spaces are the only white spaces of concern.



                                function crop(message, maxLength) { // use meaningful names
                                var result = message.trimEnd(); // Use var for function scoped variable
                                if (result.length > maxLength) // space between if ( > and )
                                const words = result.split(" "); // use const for variables that do not change
                                do
                                words.pop();
                                result = words.join(" ").trimEnd(); // ensure no trailing spaces
                                if (result.length <= maxLength) // not repeating same join operation
                                break;

                                while (words.length);

                                return result;



                                Note: Check runtime has String.trimEnd or use a polyfill or transpiler.






                                share|improve this answer









                                $endgroup$

















                                  0












                                  $begingroup$

                                  A Code Review



                                  Your code is a mess,



                                  • Inconsistent indenting.

                                  • Poor use of space between tokens, and operators.

                                  • Inappropriate use of variable declaration type let, var, const.

                                  • Contains irrelevant / unused code. eg substr

                                  Fails to meet requirements.



                                  You list the requirement




                                  "no trailing spaces in the end."




                                  Yet your code fails to do this in two ways



                                  When string is shorter than required length



                                   crop("trailing spaces ", 100); // returns "trailing spaces "


                                  When string contains 2 or more spaces near required length.



                                   crop("Trailing spaces strings with extra spaces", 17); // returns "Trailing spaces "


                                  Note: There are various white space characters not just the space. There are also special unicode characters the are visually 1 character (depending on device OS) yet take up 2 or more characters. eg "👨‍🚀".length === 5 is true. All JavaScript strings are Unicode.



                                  Rewrite



                                  Using the same logic (build return string from array of split words) the following example attempts to correct the style and adherence to the requirements.



                                  I prefer 4 space indentation (using spaces not tabs as tabs always seem to stuff up when copying between systems) however 2 spaces is acceptable (only by popularity)



                                  I assume that the message was converted from ASCII and spaces are the only white spaces of concern.



                                  function crop(message, maxLength) { // use meaningful names
                                  var result = message.trimEnd(); // Use var for function scoped variable
                                  if (result.length > maxLength) // space between if ( > and )
                                  const words = result.split(" "); // use const for variables that do not change
                                  do
                                  words.pop();
                                  result = words.join(" ").trimEnd(); // ensure no trailing spaces
                                  if (result.length <= maxLength) // not repeating same join operation
                                  break;

                                  while (words.length);

                                  return result;



                                  Note: Check runtime has String.trimEnd or use a polyfill or transpiler.






                                  share|improve this answer









                                  $endgroup$















                                    0












                                    0








                                    0





                                    $begingroup$

                                    A Code Review



                                    Your code is a mess,



                                    • Inconsistent indenting.

                                    • Poor use of space between tokens, and operators.

                                    • Inappropriate use of variable declaration type let, var, const.

                                    • Contains irrelevant / unused code. eg substr

                                    Fails to meet requirements.



                                    You list the requirement




                                    "no trailing spaces in the end."




                                    Yet your code fails to do this in two ways



                                    When string is shorter than required length



                                     crop("trailing spaces ", 100); // returns "trailing spaces "


                                    When string contains 2 or more spaces near required length.



                                     crop("Trailing spaces strings with extra spaces", 17); // returns "Trailing spaces "


                                    Note: There are various white space characters not just the space. There are also special unicode characters the are visually 1 character (depending on device OS) yet take up 2 or more characters. eg "👨‍🚀".length === 5 is true. All JavaScript strings are Unicode.



                                    Rewrite



                                    Using the same logic (build return string from array of split words) the following example attempts to correct the style and adherence to the requirements.



                                    I prefer 4 space indentation (using spaces not tabs as tabs always seem to stuff up when copying between systems) however 2 spaces is acceptable (only by popularity)



                                    I assume that the message was converted from ASCII and spaces are the only white spaces of concern.



                                    function crop(message, maxLength) { // use meaningful names
                                    var result = message.trimEnd(); // Use var for function scoped variable
                                    if (result.length > maxLength) // space between if ( > and )
                                    const words = result.split(" "); // use const for variables that do not change
                                    do
                                    words.pop();
                                    result = words.join(" ").trimEnd(); // ensure no trailing spaces
                                    if (result.length <= maxLength) // not repeating same join operation
                                    break;

                                    while (words.length);

                                    return result;



                                    Note: Check runtime has String.trimEnd or use a polyfill or transpiler.






                                    share|improve this answer









                                    $endgroup$



                                    A Code Review



                                    Your code is a mess,



                                    • Inconsistent indenting.

                                    • Poor use of space between tokens, and operators.

                                    • Inappropriate use of variable declaration type let, var, const.

                                    • Contains irrelevant / unused code. eg substr

                                    Fails to meet requirements.



                                    You list the requirement




                                    "no trailing spaces in the end."




                                    Yet your code fails to do this in two ways



                                    When string is shorter than required length



                                     crop("trailing spaces ", 100); // returns "trailing spaces "


                                    When string contains 2 or more spaces near required length.



                                     crop("Trailing spaces strings with extra spaces", 17); // returns "Trailing spaces "


                                    Note: There are various white space characters not just the space. There are also special unicode characters the are visually 1 character (depending on device OS) yet take up 2 or more characters. eg "👨‍🚀".length === 5 is true. All JavaScript strings are Unicode.



                                    Rewrite



                                    Using the same logic (build return string from array of split words) the following example attempts to correct the style and adherence to the requirements.



                                    I prefer 4 space indentation (using spaces not tabs as tabs always seem to stuff up when copying between systems) however 2 spaces is acceptable (only by popularity)



                                    I assume that the message was converted from ASCII and spaces are the only white spaces of concern.



                                    function crop(message, maxLength) { // use meaningful names
                                    var result = message.trimEnd(); // Use var for function scoped variable
                                    if (result.length > maxLength) // space between if ( > and )
                                    const words = result.split(" "); // use const for variables that do not change
                                    do
                                    words.pop();
                                    result = words.join(" ").trimEnd(); // ensure no trailing spaces
                                    if (result.length <= maxLength) // not repeating same join operation
                                    break;

                                    while (words.length);

                                    return result;



                                    Note: Check runtime has String.trimEnd or use a polyfill or transpiler.







                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered 17 mins ago









                                    Blindman67Blindman67

                                    10.6k1623




                                    10.6k1623



























                                        draft saved

                                        draft discarded
















































                                        Thanks for contributing an answer to Code Review Stack Exchange!


                                        • 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.

                                        Use MathJax to format equations. MathJax reference.


                                        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%2fcodereview.stackexchange.com%2fquestions%2f220011%2fcropping-a-message-using-array-splits%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

                                        19. јануар Садржај Догађаји Рођења Смрти Празници и дани сећања Види још Референце Мени за навигацијуу

                                        Israel Cuprins Etimologie | Istorie | Geografie | Politică | Demografie | Educație | Economie | Cultură | Note explicative | Note bibliografice | Bibliografie | Legături externe | Meniu de navigaresite web oficialfacebooktweeterGoogle+Instagramcanal YouTubeInstagramtextmodificaremodificarewww.technion.ac.ilnew.huji.ac.ilwww.weizmann.ac.ilwww1.biu.ac.ilenglish.tau.ac.ilwww.haifa.ac.ilin.bgu.ac.ilwww.openu.ac.ilwww.ariel.ac.ilCIA FactbookHarta Israelului"Negotiating Jerusalem," Palestine–Israel JournalThe Schizoid Nature of Modern Hebrew: A Slavic Language in Search of a Semitic Past„Arabic in Israel: an official language and a cultural bridge”„Latest Population Statistics for Israel”„Israel Population”„Tables”„Report for Selected Countries and Subjects”Human Development Report 2016: Human Development for Everyone„Distribution of family income - Gini index”The World FactbookJerusalem Law„Israel”„Israel”„Zionist Leaders: David Ben-Gurion 1886–1973”„The status of Jerusalem”„Analysis: Kadima's big plans”„Israel's Hard-Learned Lessons”„The Legacy of Undefined Borders, Tel Aviv Notes No. 40, 5 iunie 2002”„Israel Journal: A Land Without Borders”„Population”„Israel closes decade with population of 7.5 million”Time Series-DataBank„Selected Statistics on Jerusalem Day 2007 (Hebrew)”Golan belongs to Syria, Druze protestGlobal Survey 2006: Middle East Progress Amid Global Gains in FreedomWHO: Life expectancy in Israel among highest in the worldInternational Monetary Fund, World Economic Outlook Database, April 2011: Nominal GDP list of countries. Data for the year 2010.„Israel's accession to the OECD”Popular Opinion„On the Move”Hosea 12:5„Walking the Bible Timeline”„Palestine: History”„Return to Zion”An invention called 'the Jewish people' – Haaretz – Israel NewsoriginalJewish and Non-Jewish Population of Palestine-Israel (1517–2004)ImmigrationJewishvirtuallibrary.orgChapter One: The Heralders of Zionism„The birth of modern Israel: A scrap of paper that changed history”„League of Nations: The Mandate for Palestine, 24 iulie 1922”The Population of Palestine Prior to 1948originalBackground Paper No. 47 (ST/DPI/SER.A/47)History: Foreign DominationTwo Hundred and Seventh Plenary Meeting„Israel (Labor Zionism)”Population, by Religion and Population GroupThe Suez CrisisAdolf EichmannJustice Ministry Reply to Amnesty International Report„The Interregnum”Israel Ministry of Foreign Affairs – The Palestinian National Covenant- July 1968Research on terrorism: trends, achievements & failuresThe Routledge Atlas of the Arab–Israeli conflict: The Complete History of the Struggle and the Efforts to Resolve It"George Habash, Palestinian Terrorism Tactician, Dies at 82."„1973: Arab states attack Israeli forces”Agranat Commission„Has Israel Annexed East Jerusalem?”original„After 4 Years, Intifada Still Smolders”From the End of the Cold War to 2001originalThe Oslo Accords, 1993Israel-PLO Recognition – Exchange of Letters between PM Rabin and Chairman Arafat – Sept 9- 1993Foundation for Middle East PeaceSources of Population Growth: Total Israeli Population and Settler Population, 1991–2003original„Israel marks Rabin assassination”The Wye River Memorandumoriginal„West Bank barrier route disputed, Israeli missile kills 2”"Permanent Ceasefire to Be Based on Creation Of Buffer Zone Free of Armed Personnel Other than UN, Lebanese Forces"„Hezbollah kills 8 soldiers, kidnaps two in offensive on northern border”„Olmert confirms peace talks with Syria”„Battleground Gaza: Israeli ground forces invade the strip”„IDF begins Gaza troop withdrawal, hours after ending 3-week offensive”„THE LAND: Geography and Climate”„Area of districts, sub-districts, natural regions and lakes”„Israel - Geography”„Makhteshim Country”Israel and the Palestinian Territories„Makhtesh Ramon”„The Living Dead Sea”„Temperatures reach record high in Pakistan”„Climate Extremes In Israel”Israel in figures„Deuteronom”„JNF: 240 million trees planted since 1901”„Vegetation of Israel and Neighboring Countries”Environmental Law in Israel„Executive branch”„Israel's election process explained”„The Electoral System in Israel”„Constitution for Israel”„All 120 incoming Knesset members”„Statul ISRAEL”„The Judiciary: The Court System”„Israel's high court unique in region”„Israel and the International Criminal Court: A Legal Battlefield”„Localities and population, by population group, district, sub-district and natural region”„Israel: Districts, Major Cities, Urban Localities & Metropolitan Areas”„Israel-Egypt Relations: Background & Overview of Peace Treaty”„Solana to Haaretz: New Rules of War Needed for Age of Terror”„Israel's Announcement Regarding Settlements”„United Nations Security Council Resolution 497”„Security Council resolution 478 (1980) on the status of Jerusalem”„Arabs will ask U.N. to seek razing of Israeli wall”„Olmert: Willing to trade land for peace”„Mapping Peace between Syria and Israel”„Egypt: Israel must accept the land-for-peace formula”„Israel: Age structure from 2005 to 2015”„Global, regional, and national disability-adjusted life years (DALYs) for 306 diseases and injuries and healthy life expectancy (HALE) for 188 countries, 1990–2013: quantifying the epidemiological transition”10.1016/S0140-6736(15)61340-X„World Health Statistics 2014”„Life expectancy for Israeli men world's 4th highest”„Family Structure and Well-Being Across Israel's Diverse Population”„Fertility among Jewish and Muslim Women in Israel, by Level of Religiosity, 1979-2009”„Israel leaders in birth rate, but poverty major challenge”„Ethnic Groups”„Israel's population: Over 8.5 million”„Israel - Ethnic groups”„Jews, by country of origin and age”„Minority Communities in Israel: Background & Overview”„Israel”„Language in Israel”„Selected Data from the 2011 Social Survey on Mastery of the Hebrew Language and Usage of Languages”„Religions”„5 facts about Israeli Druze, a unique religious and ethnic group”„Israël”Israel Country Study Guide„Haredi city in Negev – blessing or curse?”„New town Harish harbors hopes of being more than another Pleasantville”„List of localities, in alphabetical order”„Muncitorii români, doriți în Israel”„Prietenia româno-israeliană la nevoie se cunoaște”„The Higher Education System in Israel”„Middle East”„Academic Ranking of World Universities 2016”„Israel”„Israel”„Jewish Nobel Prize Winners”„All Nobel Prizes in Literature”„All Nobel Peace Prizes”„All Prizes in Economic Sciences”„All Nobel Prizes in Chemistry”„List of Fields Medallists”„Sakharov Prize”„Țara care și-a sfidat "destinul" și se bate umăr la umăr cu Silicon Valley”„Apple's R&D center in Israel grew to about 800 employees”„Tim Cook: Apple's Herzliya R&D center second-largest in world”„Lecții de economie de la Israel”„Land use”Israel Investment and Business GuideA Country Study: IsraelCentral Bureau of StatisticsFlorin Diaconu, „Kadima: Flexibilitate și pragmatism, dar nici un compromis în chestiuni vitale", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 71-72Florin Diaconu, „Likud: Dreapta israeliană constant opusă retrocedării teritoriilor cureite prin luptă în 1967", în Revista Institutului Diplomatic Român, anul I, numărul I, semestrul I, 2006, pp. 73-74MassadaIsraelul a crescut in 50 de ani cât alte state intr-un mileniuIsrael Government PortalIsraelIsraelIsraelmmmmmXX451232cb118646298(data)4027808-634110000 0004 0372 0767n7900328503691455-bb46-37e3-91d2-cb064a35ffcc1003570400564274ge1294033523775214929302638955X146498911146498911

                                        Кастелфранко ди Сопра Становништво Референце Спољашње везе Мени за навигацију43°37′18″ СГШ; 11°33′32″ ИГД / 43.62156° СГШ; 11.55885° ИГД / 43.62156; 11.5588543°37′18″ СГШ; 11°33′32″ ИГД / 43.62156° СГШ; 11.55885° ИГД / 43.62156; 11.558853179688„The GeoNames geographical database”„Istituto Nazionale di Statistica”проширитиууWorldCat156923403n850174324558639-1cb14643287r(подаци)