【问题标题】:JS: restart loop with a updated index numberJS:使用更新的索引号重新启动循环
【发布时间】:2026-02-23 18:05:01
【问题描述】:

是否有可能用新的索引号重新开始这个循环:

    let ar = [1, 1, 2, 1, 2, 1, 3, 2, 3, 1];
    let sortedArray = ar.sort();

    let sameNumbersArray = [];
    let numberOfSameNumbers = 0;

    let lastIndexNumber = 0;

    for (i = lastIndexNumber; i < sortedArray.length; i++) {
      if (sortedArray[i] == sortedArray[i + 1]) {
        const sameNumber = sortedArray[i];
        sameNumbersArray.push(sameNumber);
      } else {
        break;
      }

      let lastIndexFromNumberArray = [];
      lastIndexFromNumberArray.push(sameNumbersArray.length);
      lastIndexFromNumberArray.push(3);
      lastIndexFromNumberArray.push(2);


      lastIndexNumber = lastIndexFromNumberArray.reduce(function (a, b) {
        return a + b;
      }, 0);

所以基本上循环 (lastIndexNumber) 从 index[0] 开始,然后从 index[5] 和 index[7] 重新开始。

如何添加这个额外的循环?

【问题讨论】:

    标签: javascript loops for-loop if-statement


    【解决方案1】:

    我不是 100% 清楚这里的目标。您能否详细说明上述预期的结果?

    您似乎想从源数组中获取唯一编号的数组,或许还有唯一编号的数量?

    如果是这样,这是另一种可能更清洁的方法:

    let ar = [1, 1, 2, 1, 2, 1, 3, 2, 3, 1];
    let sortedArray = ar.sort();
    
    let newSameNumbersArray = unique(sortedArray);
    //array of unique numbers:
    console.log(newSameNumbersArray);
    //count of unique numbers:
    console.log(newSameNumbersArray.length);
    
    function unique(array) {
        return Array.from(new Set(array));
    }
    

    这是基于这个答案:https://*.com/a/44405494/4801692

    也就是说,您可以直接设置i 的值并使用continue 移动到“下一个”迭代。

    i = 5;
    continue;
    

    这很糟糕,因为您有可能将i 输入一个较低的数字并陷入无限循环。如果您能多解释一下要求,我可能会提出更好的建议。

    【讨论】:

    • 感谢您的详细回复。请注意,我是一个完整的新手。我查看了您的“设置”建议 - 不幸的是,我认为它不起作用,但这是因为我没有很好地解释......我不想放整个代码,因为它很长而且令人困惑。我有以下挑战:hackerrank.com/challenges/sock-merchant/…
    • 所以我需要找到成对的数字。我的想法是计算所有的 1,然后是 2,3 ......然后将它们除以 2,我会得到我的结果。但我需要一些如何以不同的起点重新启动循环,具体取决于它停止的位置......不确定这是否有帮助......?
    【解决方案2】:

    你可以做这样的事情来找到对

    let ar = [10, 10, 10, 20, 20, 10 ,30, 20 ,30]
    
    function findPair(ar) {
            let counts = {};
            let count = [];
            let sum = 0;
    
    for(let i = 0; i < ar.length; i++){
        let item = ar[i]
         counts[item] = counts[item] >= 1 ? counts[item] + 1 : 1;
    }
    count = Object.values(counts);
    for(let i = 0; i < count.length; i++){
        if(count[i] >= 2){
            sum += Math.floor(count[i]/2)
        }
    }
    console.log(sum)
    }
    
    findPair(ar)

    【讨论】:

    • 谢谢,你确实解决了。只是我无法遵循代码......我需要了解对象和背后的逻辑......? : 谢谢你的工作!