当我在同一个数组中插入值时,为什么我的push函数不起作用

时间:2015-05-07 17:08:08

标签: javascript

CREATE OR REPLACE FORCE VIEW Schema.V1
(col1,col2,col3)
AS
SELECT col1,col2,col3 
FROM table1

当我在同一个数组中插入值时,为什么我的push函数不起作用?

当我插入另一个数组时,它可以工作。

6 个答案:

答案 0 :(得分:1)

剖析代码的相关部分:

// Allocate an array containing three values that will match: [3, 6, 9]
var myNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

// Get the length of myNums *every iteration*
for (i = 0; i < myNums.length; i++) {
  if (myNums[i] % 3 == 0) {
    ...
  } else {
    // Append the value to myNums if it is evenly divisible by three
    myNums.push(myNums[i])
  }
}

这将达到无限循环。

在每次迭代中,myNums将如下所示:

[_1_, 2, 3, 4, 5, 6, 7, 8, 9, 10] // append 1
[1, _2_, 3, 4, 5, 6, 7, 8, 9, 10, 1] // append 2
[1, 2, _3_, 4, 5, 6, 7, 8, 9, 10, 1, 2]
[1, 2, 3, _4_, 5, 6, 7, 8, 9, 10, 1, 2] // append 4
[1, 2, 3, 4, _5_, 6, 7, 8, 9, 10, 1, 2, 4] // append 5
... and so on

一旦你到达集合的末尾,每次迭代都会在最后附加另一个值。

如果您不想点击附加内容,可以轻松解决此问题:

var myNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var Remve = [];
var i;

var l = myNums.length;
for (i = 0; i < l; i++) {
  if (myNums[i] % 3 == 0) {
    Remve.push(myNums[i])
  } else {
    myNums.push(myNums[i])
  }
}

document.write(myNums);
document.write(Remve);

首先缓存长度,你不会进入无限循环。

您也可以将不可分割的项目推送到不同的数组而不是当前项目的末尾,这样可以很好地解决问题。

答案 1 :(得分:0)

你没有说“不工作”是什么意思,我不确定你要做什么,但我看到了一个问题。循环离开了数组的长度,每次数组在第9次迭代后运行时都会发生变化,从而导致无限循环。将其保存在静态变量中可以解决这个问题:

var myNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var Remve = [];
var i;

var myNumLength = myNums.length;

for(i=0;i<myNumLength;i++){
    if(myNums[i] % 3 == 0){
        Remve.push(myNums[i])
    }else{
        myNums.push(myNums[i])
    }
}

document.write(myNums);
document.write('<br>');
document.write(Remve);

更新:新代码:

var originalNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var newNums = [];
var removedNums = [];
var i;

var myNumLength = originalNums.length;

for(i=0;i<myNumLength;i++){
    if(originalNums[i] % 3 == 0){
        removedNums.push(originalNums[i])
    }else{
        newNums.push(originalNums[i])
    }
}

document.write(newNums);
document.write('<br>');
document.write(removedNums);

再次更新

var myNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var removedNums = [];
var i;

var myNumLength = myNums.length;

for(i=0;i<myNumLength;i++){
    if(myNums[i] % 3 == 0){
        removedNums.push(myNums[i]);
        myNums.splice(i, 1);
        i--;
    }
}

document.write(myNums);
document.write('<br>');
document.write(removedNums);

答案 2 :(得分:0)

A)您不断检查myNums.length,同时在其中插入值。

B)它正在工作,因为你可以看到一遍又一遍地出现在myNums中的相同值。但这是一个无限循环。

C)Console.log(Rmve);表明您确实选择了可被3整除的数字。

答案 3 :(得分:0)

它在无限循环中运行。您在同一个数组中推送值,因此数组长度不断增加,并且永远不会结束。

    var myNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var Remve = [];
var i;

for(i=0;i<myNums.length;i++){
    if(myNums[i] % 3 == 0){
        Remve.push(myNums[i])
    }else{
        myNums.push(myNums[i]) //problematic line
    }

}

答案 4 :(得分:0)

您当前的代码生成无限循环,您的退出条件永远不会得到满足。

请注意,var myNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var Remve = []; var i; var arrayLength = myNums.length; // get length BEFORE starting for loop for(i=0; i < arrayLength; i++){ if(myNums[i] % 3 == 0){ Remve.push(myNums[i]) }else{ myNums.push(myNums[i]) } } alert(myNums); alert(Remve); 因为在循环中添加新元素而不断增加。

在开始迭代之前你应该得到数组长度

    -(IBAction)addComment:(id)sender
{
    //multiline comments
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Export"
                                                        message:@"Save this report to the feed with a comment?"
                                                       delegate:self
                                              cancelButtonTitle:@"No"
                                              otherButtonTitles:@"Yes", nil];

    alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
    UITextView *textView = [UITextView new];
    [alertView setValue: textView forKey:@"accessoryView"];
    alertView.tag = 3;
    [alertView show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    //Check for confirmation on exporting.
    if (alertView.tag == 3) {
        UITextView *textView = [UITextView new];
        [alertView setValue: textView forKey:@"accessoryView"];
        if (buttonIndex == 1)[self writeData:textView.text];
    }
}

答案 5 :(得分:-1)

使用单独的数组(myNumsArr)来存储值而不是myNums。您当前的代码将导致无限循环。

var myNums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var myNumsArr = [];
var Remve = [];
var i;

for(i=0;i<myNums.length;i++){
    if(myNums[i] % 3 == 0){
        Remve.push(myNums[i])
    }else{
        myNumsArr.push(myNums[i])
    }
}

myNums = myNums.concat(myNumsArr);