【问题标题】:how to stop atribution to variable in for if如何停止对变量的归因
【发布时间】:2019-12-05 15:29:46
【问题描述】:

我是一个编程新手——实际上我正在学习javaScript,但我在一项任务中遇到了问题。

这是代码:

let myFewNumbers = [1, 4, 3, 2, 4, 5, 1, 2, 5, 9];
let myIndex = 0;

for (i = 0; i < myFewNumbers.length; i++) {
  for (j = 0; j < myFewNumbers.length; j++) {
    if (i != j && myFewNumbers[i] === myFewNumbers[j]) {
      myIndex = j;
      break;
    }
  }
}
console.log(myIndex);

我不知道如何将atribution 停止为变量,因为当if 为真时,将变量myIndex 更改为j 但我想知道first 重复的数字,而不是最后一个。我知道我的其余代码没问题,我不想更改任何内容,但我认为if 行中缺少某些内容。

【问题讨论】:

  • 您需要在外部 for 循环上设置一个标志。
  • 您的break 只会破坏内部循环。
  • 期望的结果是什么?
  • 我正在寻找表中重复的第一个数字,所以 myIndex 应该显示“1”,因为第一个重复的数字是 4

标签: javascript for-loop if-statement


【解决方案1】:

我在外循环的条件中添加了一个标志foundIndex

这样,当内循环到达中断时,外循环立即退出。

更新:看起来您想要第一个副本的第一个索引。我已经更新了逻辑以反映这一点。

你需要:

  1. 将此添加到您的条件中:j &gt; i
  2. 存储和排序每个索引以获得最小索引

let myFewNumbers = [1, 4, 3, 2, 4, 5, 1, 2, 5, 9];
let myIndex = 0;
let foundIndicies = [];

for (i = 0; i < myFewNumbers.length; i++) {
  for (j = 0; j < myFewNumbers.length; j++) {
    if (j > i && i != j && myFewNumbers[i] === myFewNumbers[j]) {
      myIndex = j;
      foundIndicies.push(j);
    }
  }
}
console.log(Math.min.apply(Math, foundIndicies)); // 4

函数式方法

更简单的设计模式是将其包装在一个函数中,并在找到重复值后立即退出。

您的最终条件如下所示,按以下顺序:

if (j < minIndex && i !== j && j > i && arr[i] === arr[j])

// The number 4 is the first duplicate to appear.
console.log(findFirstDuplicateIndex( [1, 4, 3, 2, 4, 5, 1, 2, 5, 9] )); // Index: 4 
console.log(findFirstDuplicate(      [1, 4, 3, 2, 4, 5, 1, 2, 5, 9] )); // Value: 4 

// With the duplicate 4 removed, 1 is now the first duplicate.
console.log(findFirstDuplicateIndex( [1, 4, 3, 2, 5, 1, 2, 5, 9]    )); // Index: 5 
console.log(findFirstDuplicate(      [1, 4, 3, 2, 5, 1, 2, 5, 9]    )); // Value: 1

function findFirstDuplicate(arr) {
  let index = findFirstDuplicateIndex(arr);
  return index > -1 ? arr[index] : null;
}

function findFirstDuplicateIndex(arr) {
  let minIndex = Number.MAX_SAFE_INTEGER;
  for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr.length; j++) {
      if (j < minIndex && i !== j && j > i && arr[i] === arr[j]) {
        minIndex = j;
      }
    }
  }
  return minIndex !== Number.MAX_SAFE_INTEGER ? minIndex : -1;
}

【讨论】:

  • 我正在寻找表中重复的第一个数字,因此 myIndex 应该显示“1”,因为第一个重复的数字是 4。在您的命题中有 6
  • @hvma411 上次更新了,清理了函数示例中的逻辑。
【解决方案2】:

如果您在循环中添加另一个条件,则无需中断。这是一个例子:

let myFewNumbers = [1, 4, 3, 2, 4, 5, 1, 2, 5, 9];
let myIndex = -1;

for (i = 0; i < myFewNumbers.length && myIndex < 0; i++) {
  for (j = 0; j < myFewNumbers.length && myIndex < 0; j++) {
    if (i != j && myFewNumbers[i] === myFewNumbers[j]) {
      myIndex = j;
    }
  }
}
console.log(myIndex);

【讨论】:

    【解决方案3】:

    有多种可能的答案,但有用且有趣的是标记循环:

    fast:
    for (i = 0; i < 5; i++)
    {
        for (j = 0; j < 5; j++)
        {
            if (j === 2)
                break fast;
        }
    }
    

    【讨论】:

      【解决方案4】:

      您可以使用标签打破超过 1 个循环

      let myFewNumbers = [1, 4, 3, 2, 4, 5, 1, 2, 5, 9];
      let myIndex = 0;
      
      outer_loop:
      for (i = 0; i < myFewNumbers.length; i++) {
          for (j = 0; j < myFewNumbers.length; j++) {
              if (i != j && myFewNumbers[i] === myFewNumbers[j]) {
                  myIndex = j;
                  break outer_loop;
              }
          }
      }
      
      console.log(myIndex);
      

      【讨论】:

        【解决方案5】:

        这是因为你有两个循环,但你在第二个循环中只有break;(停止执行循环):

        let myFewNumbers = [1, 4, 3, 2, 4, 5, 1, 2, 5, 9];
        let myIndex = 0;
        let foundDuplicate = false;
        
        for (i = 0; i < myFewNumbers.length; i++) {
          for (j = 0; j < myFewNumbers.length; j++) {
            if (i != j && myFewNumbers[i] === myFewNumbers[j]) {
              myIndex = j;
              foundDuplicate = true
              break;
            }
          }
          if(foundDuplicate )break;
        }
        console.log(myIndex);
        

        不太清楚为什么你有两个循环而不是一个,但这应该会有所帮助:)

        【讨论】:

        • 我认为你的 'if(foundDuplicate )break;` 需要向下一行。
        【解决方案6】:

        我已经尝试过您的代码,但不是我要查找的代码。我想知道第一个重复的数字,所以如果我的表是“const myFewNumbers = [1, 4, 3, 2, 4, 5, 1, 2, 5, 9];”第一个重复的数字是 4,所以“myIndex”应该显示“1”。

        【讨论】:

          【解决方案7】:

          您的问题是,虽然您从内部循环中断,但外部循环继续迭代。

          不要为myIndex 分配数字,只要myIndexundefined,就在外循​​环(i) 中迭代。

          注意事项:

          1. ilength - 1 时,您可以停止循环,因为最后一个数字不能与其自身重复。
          2. 您可以将 j 初始化为i + 1,然后您可以删除条件i != k,因为您已经涵盖了j 小于或等于i 的所有情况。

          let myFewNumbers = [1, 4, 3, 2, 4, 5, 1, 2, 5, 9];
          let myIndex;
          
          for (i = 0; i < myFewNumbers.length - 1 && myIndex === undefined; i++) {
            for (j = i + 1; j < myFewNumbers.length; j++) {
              if (myFewNumbers[i] === myFewNumbers[j]) {
                myIndex = i;
                break;
              }
            }
          }
          console.log(myIndex);

          更好的选择是将循环包装在一个函数中,并在if 条件为true 时返回:

          const myFewNumbers = [1, 4, 3, 2, 4, 5, 1, 2, 5, 9];
          
          const fn = arr => {
            for (i = 0; i < myFewNumbers.length - 1; i++) {
              for (j = i + 1; j < myFewNumbers.length; j++) {
                if (myFewNumbers[i] === myFewNumbers[j]) {
                  return i;
                }
              }
            }
          };
          
          const myIndex = fn(myFewNumbers);
          
          console.log(myIndex);

          【讨论】:

          • 我正在寻找表中重复的第一个数字,因此 myIndex 应该显示“1”,因为第一个重复的数字是 4。在您的命题中有 6
          • 答案应该是 0,因为 1 也是重复的。您应该使用i 作为结果。更新了答案。
          猜你喜欢
          • 2015-03-30
          • 2012-02-12
          • 2013-05-18
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 2020-08-04
          相关资源
          最近更新 更多