admin管理员组

文章数量:1396114

I am trying to insert a hyphen "‐" between the even numbers in an array so if i have 43268356925485942568 it shows 432–6–83569254–8594–256–8. The numbers are randomly generated. I tried several things but no luck.

<body>
    <div id="arrayDisp">
    </div>
    <div id="numbers"> 

    </div>
    <script>
        var numbers = new Array(20);
        var numbers2 = new Array(20)

        for (var i = 0; i< numbers.length; i++)
        {
            numbers[i] = parseInt(Math.random() * 10);
        }

        document.getElementById("arrayDisp").innerHTML = numbers.join(" ");

        for(var i in numbers)  
        {  
            if(i%2 == 0)
            {  
                numbers2.push('‐',i);
            }  
            else  
            {  
                numbers2.push(i);  
            }  
        }           
        document.getElementById("numbers").innerHTML = numbers2.join("");

    </script>
</body>

I am trying to insert a hyphen "‐" between the even numbers in an array so if i have 43268356925485942568 it shows 432–6–83569254–8594–256–8. The numbers are randomly generated. I tried several things but no luck.

<body>
    <div id="arrayDisp">
    </div>
    <div id="numbers"> 

    </div>
    <script>
        var numbers = new Array(20);
        var numbers2 = new Array(20)

        for (var i = 0; i< numbers.length; i++)
        {
            numbers[i] = parseInt(Math.random() * 10);
        }

        document.getElementById("arrayDisp").innerHTML = numbers.join(" ");

        for(var i in numbers)  
        {  
            if(i%2 == 0)
            {  
                numbers2.push('‐',i);
            }  
            else  
            {  
                numbers2.push(i);  
            }  
        }           
        document.getElementById("numbers").innerHTML = numbers2.join("");

    </script>
</body>
Share Improve this question asked Feb 28, 2015 at 20:56 criscris 312 silver badges6 bronze badges 3
  • If the pattern is fixed (i.e. XXX–X–XXXXXXXX–XXXX–XXX–X) I would do it server side using something like sprintf function – sdespont Commented Feb 28, 2015 at 20:59
  • what are you getting as a result now? – T McKeown Commented Feb 28, 2015 at 20:59
  • @sdespont - the numbers are randomly generated – j08691 Commented Feb 28, 2015 at 20:59
Add a ment  | 

5 Answers 5

Reset to default 4

Just check the current and next number to see if they are even ?

function addHyphen(str) {
    var arr = str.split('');
        
    return arr.map(function(n, i) {
        return (n % 2 === 0) && (arr[i+1] % 2 === 0) ? n+'-' : n;
    }).join('');
}

// provided number
var s       = '43268356925485942568';
var result1 = addHyphen(s);

// create random number
var rand = (new Array(20)).join('s').split('s').map(function(x) { 
    return parseInt(Math.random() * 10, 10);
}).join('');

var result2 = addHyphen(rand);

document.body.innerHTML = result1 + '<br />' + result2;

You can use a regular expression to find an even digit followed by another and insert a dash there:

var numbers = '';
for (var i = 0; i < 20; i++) {
  numbers += Math.floor(Math.random() * 10);
}

numbers = numbers.replace(/([02468])(?=[02468])/g, '$1-');

// show in Stackoverflow snippet
document.write(numbers);

Explanation:

()           captures a match
([02468])    matches an even digit and captures it
(?=)         is a positive look-ahead
(?=[02468])  matches when the next digit is even

The replacement string uses $1 to insert the captured digit and then a dash.

I don't understand why everybody es up with overplex (and sometimes non functional) code. It's simple task! No callbacks, regexps are needed and they don't even make the code easy to understand!

Using Array.splice and working with original array

/** Requires array of numbers, changes THAT array, returns null 
  * @param numbers array of numbers
**/
function addHyphenWhenEven(numbers) {
  for(var i=1, l=numbers.length;i<l; i++) {
    if((numbers[i]%2 + numbers[i-1]%2) == 0) {
      //Splice inserts 3rd parameter before i-th position
      numbers.splice(i, 0, "-"); 
      //Must shift the positions as the array dimensions have changed
      i--;l++;
    }      
  }
}

Using new array

/** Requires array of numbers, returns new array with hyphens
  * @param numbers array of numbers
  * @return array with numbers and hyphens
**/
function addHyphenWhenEven2(numbers) {
  if(numbers.length==0)
    return [];
  var result = [numbers[0]];
  for(var i=1, l=numbers.length;i<l; i++) {
    if((numbers[i]%2 + numbers[i-1]%2) == 0) {
      result.push("-");
    }
    result.push(numbers[i]);  
  }
  return result;
}

/** Requires array of numbers, changes THAT array, returns null 
      * @param numbers array of numbers
    **/
    function addHyphenWhenEven(numbers) {
      for(var i=1, l=numbers.length;i<l; i++) {
        if((numbers[i]%2 + numbers[i-1]%2) == 0) {
          //Splice inserts 3rd parameter before i-th position
          numbers.splice(i, 0, "-"); 
          //Must shift the positions as the array dimensions have changed
          i--;l++;
        }      
      }
    }

    /** Requires array of numbers, returns new array with hyphens
      * @param numbers array of numbers
      * @return array with numbers and hyphens
    **/
    function addHyphenWhenEven2(numbers) {
      if(numbers.length==0)
        return [];
      var result = [numbers[0]];
      for(var i=1, l=numbers.length;i<l; i++) {
        if((numbers[i]%2 + numbers[i-1]%2) == 0) {
          result.push("-");
        }
        result.push(numbers[i]);  
      }
      return result;
    }
var random = [];
while(random.length<20)
{
  random.push(Math.floor(Math.random()*10));  
}

$("#res2")[0].innerHTML = addHyphenWhenEven2(random).join("");

addHyphenWhenEven(random);
$("#res1")[0].innerHTML = random.join("");
<script src="https://ajax.googleapis./ajax/libs/jquery/2.1.0/jquery.min.js"></script>
<h2>Using <tt>Array.splice</tt></h2>
<div id="res1"></div>
<h2>Using second array that is returned:</h2>
<div id="res2"></div>

var numbers = [];
var hiphenated = [];
for (var i = 0; i < 20; i++) {
    numbers.push(parseInt(Math.random() * 10));
}

numbers.forEach(function(n) {
   if (n % 2 == 0) {
    hiphenated.push(n + '-');
   } else {
    hiphenated.push(n);
   }                      
});
var s = "43268356925485942568";

s = s.split('').reduce(function(a, b) {
  return  a + ((!a || (a.slice(-1) & 1) || (b & 1))? '' : '-') + b;
}, '');

本文标签: javascriptInsert a hyphen between even numbers inside an arrayStack Overflow