Javascript 插入到数字字符串中

Javascript 插入到数字字符串中,javascript,arrays,string,insert,Javascript,Arrays,String,Insert,让函数DashInsert(num)在num中的两个奇数之间插入破折号('-')。例如:如果num是454793,则输出应该是4547-9-3。不要把零算作奇数。 这是我的代码(不工作)。当我运行它时,我得到了与无限循环相同的响应,在无限循环中我必须终止页面,但我不明白为什么。我知道有很多方法可以做到这一点,但现在我想知道为什么我的方法行不通。谢谢 function DashInsert(num) { num = num.split(""); for (i = 1; i < n

让函数DashInsert(num)在num中的两个奇数之间插入破折号('-')。例如:如果num是454793,则输出应该是4547-9-3。不要把零算作奇数。 这是我的代码(不工作)。当我运行它时,我得到了与无限循环相同的响应,在无限循环中我必须终止页面,但我不明白为什么。我知道有很多方法可以做到这一点,但现在我想知道为什么我的方法行不通。谢谢

function DashInsert(num) {  
  num = num.split("");
  for (i = 1; i < num.length; i++) {
    if (num[i - 1] % 2 != 0 && num[i] % 2 != 0) {
      num.splice(i, 0, "-");
    }
  }
  num = num.join("");
  return num;
}
函数DashInsert(num){
num=num.split(“”);
对于(i=1;i
一旦插入破折号
-
,if语句将检查此
'-'%2!=0
,它始终为真,因此会无限地插入另一个破折号

这里有一种使用正则表达式和函数替换的方法:

function DashInsert(n) {
    var f = function(m,i,s) { return m&s[i+1]&1 ? m+'-' : m; };
    return String(n).replace(/\d/g,f);
}

DashInsert(454793) // "4547-9-3"

插入破折号
-
后,
if
语句将检查此
'-'%2!=0
,它始终为真,因此会无限地插入另一个破折号

这里有一种使用正则表达式和函数替换的方法:

function DashInsert(n) {
    var f = function(m,i,s) { return m&s[i+1]&1 ? m+'-' : m; };
    return String(n).replace(/\d/g,f);
}

DashInsert(454793) // "4547-9-3"

添加破折号时,此破折号将在下一次迭代中作为数字处理。你需要前进一步

function DashInsert(num) {  
  var num = num.split("");
  for (var i = 1; i < num.length; i++) {
    if ((num[i - 1] % 2 != 0) && (num[i] % 2 != 0)) {
      num.splice(i, 0, "-");
      i++; // This is the only thing that needs changing
    }
  }
  num = num.join("");
  return num;
}
函数DashInsert(num){
var num=num.split(“”);
对于(变量i=1;i
添加破折号时,此破折号将在下一次迭代中作为数字处理。你需要前进一步

function DashInsert(num) {  
  var num = num.split("");
  for (var i = 1; i < num.length; i++) {
    if ((num[i - 1] % 2 != 0) && (num[i] % 2 != 0)) {
      num.splice(i, 0, "-");
      i++; // This is the only thing that needs changing
    }
  }
  num = num.join("");
  return num;
}
函数DashInsert(num){
var num=num.split(“”);
对于(变量i=1;i
使用
num.splice
将新条目插入数组,从而增加其长度–这使得
i
的值“落后于”增加的数组长度,因此永远不会满足中断条件

除此之外,在插入
-
后的下一次迭代中,
num[i-1]
将是
-
字符,因此实际上您正在尝试检查
'-'%2!=0
…这也没什么意义

因此,当您在数组中插入一个
-
时,您还必须将
i
增加一个–这将a)说明数组的长度增加了一个,并且它将在下一次迭代中检查
-
之后的下一个数字:

function DashInsert(num) {  
  num = num.split("");
  for (i = 1; i < num.length; i++) {
    if (num[i - 1] % 2 != 0 && num[i] % 2 != 0) {
      num.splice(i, 0, "-");
      i++; // <- this is the IMPORTANT part!
    }
  }
  num = num.join("");
  return num;
}

alert(DashInsert("454793"));
函数DashInsert(num){
num=num.split(“”);
对于(i=1;ii++;//使用
num.splice
将新条目插入数组,从而增加其长度–这使得
i
的值“落后于”增加的数组长度,因此永远不会满足中断条件

除此之外,在插入
-
后的下一次迭代中,
num[i-1]
将是
-
字符,因此实际上您正在尝试检查
'-'%2!=0
…这也没有什么意义

因此,当您在数组中插入一个
-
时,您还必须将
i
增加一个–这将a)说明数组的长度增加了一个,并且它将在下一次迭代中检查
-
之后的下一个数字:

function DashInsert(num) {  
  num = num.split("");
  for (i = 1; i < num.length; i++) {
    if (num[i - 1] % 2 != 0 && num[i] % 2 != 0) {
      num.splice(i, 0, "-");
      i++; // <- this is the IMPORTANT part!
    }
  }
  num = num.join("");
  return num;
}

alert(DashInsert("454793"));
函数DashInsert(num){
num=num.split(“”);
对于(i=1;ii++;//这是因为有时在破折号“-”本身上使用%运算符,例如在将破折号拼接到数组中之后

您可以使用克隆阵列来更正此行为

function DashInsert(num) {  
  num = num.split("");

  var clone = num.slice(0);
  var offset = 0;

  for (i = 1; i < num.length; i++) {
    if (num[i - 1] % 2 != 0 && num[i] % 2 != 0) {
      clone.splice(i + offset, 0, "-");
      offset++;
    }
  }

  return clone.join("");
}

alert(DashInsert("45739"));
函数DashInsert(num){
num=num.split(“”);
var clone=num.slice(0);
var偏移=0;
对于(i=1;i
输出:45-7-3-9


演示:

这是因为有时在短划线“-”本身上使用%运算符,例如在将短划线拼接到阵列中之后

您可以使用克隆阵列来更正此行为

function DashInsert(num) {  
  num = num.split("");

  var clone = num.slice(0);
  var offset = 0;

  for (i = 1; i < num.length; i++) {
    if (num[i - 1] % 2 != 0 && num[i] % 2 != 0) {
      clone.splice(i + offset, 0, "-");
      offset++;
    }
  }

  return clone.join("");
}

alert(DashInsert("45739"));
函数DashInsert(num){
num=num.split(“”);
var clone=num.slice(0);
var偏移=0;
对于(i=1;i
输出:45-7-3-9


演示:

为了补充前面给出的答案,我想与大家分享一个替代的实现,它不会修改现有的阵列:

function DashInsert(num) {  
  var characters = num.split("");

  var numbers = characters.map(function(chr) {
    return parseInt(chr, 10);
  });

  var withDashes = numbers.reduce(function(result, current) {
    var lastNumber = result[result.length - 1];

    if(lastNumber == null || current % 2 === 0 || lastNumber % 2 === 0) {
      return result.concat(current);
    } else {
      return result.concat("-", current);
    }
  }, []);

  return withDashes.join("");
}

它更长,但IMHO更好地揭示了其意图,并避免了最初的问题。

为了补充已经给出的伟大答案,我想分享一个替代实现,它不会修改现有的数组:

function DashInsert(num) {  
  var characters = num.split("");

  var numbers = characters.map(function(chr) {
    return parseInt(chr, 10);
  });

  var withDashes = numbers.reduce(function(result, current) {
    var lastNumber = result[result.length - 1];

    if(lastNumber == null || current % 2 === 0 || lastNumber % 2 === 0) {
      return result.concat(current);
    } else {
      return result.concat("-", current);
    }
  }, []);

  return withDashes.join("");
}

它更长,但IMHO更好地揭示了意图,并避免了最初的问题。

@A1rPun这没有什么区别。确实如此,您的代码可能会导致奇怪的行为。我认为这是因为有时您在破折号“-”本身上使用%运算符,例如在将破折号拼接到数组中之后。@A1rPun这没有什么区别是的,你的代码可能会导致奇怪的行为。我想这是因为