让函数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;
}
答案 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"));
答案 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
答案 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("");
}
时间更长,但恕我直言更好地揭示了意图,避免了原来的问题。