使用 splice 方法无限循环遍历数组 javascript
Looping through array using splice method infinite loop javascript
当我使用 splice 方法遍历数组时,页面就死机了。看起来我造成了无限循环。 lib.randomInt()
有效,所以这不是问题。
function() {
return function(string) {
var arr = string.split("")
arr.sort();
for(var i = 0; arr.length;i++){
arr.splice((i+1),0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
}
})()("example");
这来自 html
主文件上方的另一个文件
var lib = {
factorial: function(num){
function _factorial(num){
if(num === 1){
return 1;
} else {
return num*_factorial(num-1);
}
}
console.log(num+"! = " + _factorial(num));
},
randomInt: function(int,offset){
if(offset == undefined || null || NaN){
offset = 0;
}
return Math.floor(Math.random()*int)+offset;
},
display: function(m, fn){
fn(m);
}
};
修改数组本身时必须反向循环以避免像这样破坏循环...
for (var i=arr.length-1; i>=0; i--){}
我修好了。我想在每个字符之后都有一个数字。使用预循环数组长度并在迭代两次时将其加倍,意味着拼接在新数字元素之后添加数字,然后添加字符。
编辑:问题出在我的错字上。我什至不必使用 len,只需按 2 进行迭代即可。
for(var i = 0;i < arr.length;i+=2){
arr.splice((i+1),0,lib.randomInt(9));
}
(function() {
return function(string) {
var arr = string.split("")
arr.sort();
var len = arr.length
for(var i = 0;i < len*2;i+=2){
arr.splice((i+1),0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
console.log(pseudocryptarr);
}
})()("example");
编辑:user4723924 方法更好:
(function() {
return function(string) {
var arr = string.split("")
arr.sort();
for(var i = arr.length;i >= 0;i--){
arr.splice((i+1),0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
console.log(pseudocryptarr);
}
})()("example");
我猜测你想在每个数组元素后插入一个随机值,这样字符串"example"就会变成像"e5x9a2m4p7l1e3"
有两个问题:
您的 for
循环没有会变为假的结束条件。您需要声明 i < arr.length
而不是 arr.length
这对于非空数组总是真实的。
你在每次迭代中添加数组元素,但在下一次迭代中也访问它们,从那里你将只访问新插入的值而永远不会到达下一个原始元素与 i 保持 1 个索引。您需要再次递增 i。为此,如果 i+1
作为 splice
参数,您可以使用 ++i
代替。
所以你的循环应该是:
for(var i = 0; i < arr.length; i++) {
arr.splice(++i,0,lib.randomInt(9));
}
const lib = { randomInt: n => Math.floor(Math.random()*n) };
(function() {
return function(string) {
var arr = string.split("")
arr.sort();
for(var i = 0; i < arr.length; i++) {
arr.splice(++i,0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
console.log(pseudocryptarr);
}
})()("example");
或保存加法:
for(var i = 1; i <= arr.length; i+=2) {
arr.splice(i,0,lib.randomInt(9));
}
const lib = { randomInt: n => Math.floor(Math.random()*n) };
(function() {
return function(string) {
var arr = string.split("")
arr.sort();
for(var i = 1; i <= arr.length; i+=2) {
arr.splice(i,0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
console.log(pseudocryptarr);
}
})()("example");
当我使用 splice 方法遍历数组时,页面就死机了。看起来我造成了无限循环。 lib.randomInt()
有效,所以这不是问题。
function() {
return function(string) {
var arr = string.split("")
arr.sort();
for(var i = 0; arr.length;i++){
arr.splice((i+1),0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
}
})()("example");
这来自 html
主文件上方的另一个文件var lib = {
factorial: function(num){
function _factorial(num){
if(num === 1){
return 1;
} else {
return num*_factorial(num-1);
}
}
console.log(num+"! = " + _factorial(num));
},
randomInt: function(int,offset){
if(offset == undefined || null || NaN){
offset = 0;
}
return Math.floor(Math.random()*int)+offset;
},
display: function(m, fn){
fn(m);
}
};
修改数组本身时必须反向循环以避免像这样破坏循环...
for (var i=arr.length-1; i>=0; i--){}
我修好了。我想在每个字符之后都有一个数字。使用预循环数组长度并在迭代两次时将其加倍,意味着拼接在新数字元素之后添加数字,然后添加字符。
编辑:问题出在我的错字上。我什至不必使用 len,只需按 2 进行迭代即可。
for(var i = 0;i < arr.length;i+=2){
arr.splice((i+1),0,lib.randomInt(9));
}
(function() {
return function(string) {
var arr = string.split("")
arr.sort();
var len = arr.length
for(var i = 0;i < len*2;i+=2){
arr.splice((i+1),0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
console.log(pseudocryptarr);
}
})()("example");
编辑:user4723924 方法更好:
(function() {
return function(string) {
var arr = string.split("")
arr.sort();
for(var i = arr.length;i >= 0;i--){
arr.splice((i+1),0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
console.log(pseudocryptarr);
}
})()("example");
我猜测你想在每个数组元素后插入一个随机值,这样字符串"example"就会变成像"e5x9a2m4p7l1e3"
有两个问题:
您的
for
循环没有会变为假的结束条件。您需要声明i < arr.length
而不是arr.length
这对于非空数组总是真实的。你在每次迭代中添加数组元素,但在下一次迭代中也访问它们,从那里你将只访问新插入的值而永远不会到达下一个原始元素与 i 保持 1 个索引。您需要再次递增 i。为此,如果
i+1
作为splice
参数,您可以使用++i
代替。
所以你的循环应该是:
for(var i = 0; i < arr.length; i++) {
arr.splice(++i,0,lib.randomInt(9));
}
const lib = { randomInt: n => Math.floor(Math.random()*n) };
(function() {
return function(string) {
var arr = string.split("")
arr.sort();
for(var i = 0; i < arr.length; i++) {
arr.splice(++i,0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
console.log(pseudocryptarr);
}
})()("example");
或保存加法:
for(var i = 1; i <= arr.length; i+=2) {
arr.splice(i,0,lib.randomInt(9));
}
const lib = { randomInt: n => Math.floor(Math.random()*n) };
(function() {
return function(string) {
var arr = string.split("")
arr.sort();
for(var i = 1; i <= arr.length; i+=2) {
arr.splice(i,0,lib.randomInt(9));
}
var pseudocryptarr = arr.join("");
console.log(pseudocryptarr);
}
})()("example");