插入数字字符串

时间:2014-02-28 23:29:12

标签: javascript arrays string insert

让函数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;
}

5 个答案:

答案 0 :(得分:2)

插入短划线-后,if语句会检查此'-'%2 != 0,这始终为真,因此会无限制地插入另一个短划线。

这是使用正则表达式和函数replace执行此操作的一种方法:

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"

答案 1 :(得分:2)

使用num.splice,你要在数组中插入新的条目,因此增加它的长度 - 这使得i“的值在数组的长度增加后面运行,因此中断条件是从未见过。

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

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

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"));

http://jsfiddle.net/37wA9/

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

这是因为有些情况下你在短划线上使用%运算符' - '本身,例如在将短划线拼接到数组之后。

您可以使用克隆数组来纠正此行为。

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"));

输出: 45-7-3-9

演示:http://jsfiddle.net/262Bf/

答案 4 :(得分:0)

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

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("");
}

时间更长,但恕我直言更好地揭示了意图,避免了原来的问题。