为什么函数体内的 for of 循环没有给我传统 for 循环所做的预期输出?

Why is the for of loop inside the functions body not giving me the expected output that the traditional for loop is doing?

为什么函数体内的 for of 循环没有给我传统 for 循环所做的预期输出?好像for循环中的el和for循环中的iterable[i]不一样?

var uniqueInOrder = function(iterable){
     let unique = [];
     for(let el of iterable){
         let cur = el;
         let next = el + 1;
         if(cur !== next){
             unique.push(cur)
         }
     }
     return unique;
}
uniqueInOrder('AAAABBBCCDAABBB')  // unexpected output

// Returns expected output
var uniqueInOrder = function(iterable){
     let unique = [];
     for(var i = 0; i < iterable.length; i++){
         let cur = iterable[i];
         let next = iterable[i + 1];
         if(cur !== next){
             unique.push(cur)
         }
     }
     return unique;
}
uniqueInOrder('AAAABBBCCDAABBB') // ----> ["A", "B", "C", "D", "A", "B"]

您的问题出在您的第一个函数中。

在 JavaScript 中,elementfor (let element of inerable) {} 中与传统 for 循环中的 i 不同。当你写 let next = el + 时,你是在将 1 添加到一个元素,而不是一个数字(所以,在这种情况下你正在做 'A' + 1,就像@Seblor 说的)。

tl;dr eli

不同

就像@Sxribe 描述的那样,for/of 循环根本不同,您不能使用 el+1 获取下一个值。

用两个循环获得相同结果的功能方法是:

var uniqueInOrder = function(iterable){
     let unique = [];
     let prev = ''
     for(let el of iterable){
         let cur = el;
         if(cur !== prev){
            prev = el
             unique.push(prev)
         }
     }
     return unique;
}
console.log(uniqueInOrder('AAAABBBCCDAABBB'))

// Returns expected output
var uniqueInOrder = function(iterable){
     let unique = [];
     for(var i = 0; i < iterable.length; i++){
         let cur = iterable[i];
         let next = iterable[i + 1];
         if(cur !== next){
             unique.push(cur)
         }
     }
     return unique;
}
console.log(uniqueInOrder('AAAABBBCCDAABBB'))

在这个例子中,我们不是检查当前值与下一个值,而是检查当前值与前一个值。

正如@Sxribe 所说,您得到的是元素而不是 i 计数。

所以你需要检查 el 是否存在于数组中,如果不存在则将其推送到数组中。 所以像这样的东西就可以了。

function uniqueInOrder (iterable){
   let unique = [];
   for(let el of iterable){
      let cur = el;
      if(unique.indexOf(el) === -1){
         unique.push(cur)
      }
   }
   return unique;
}

console.log(uniqueInOrder('AAAABBBCCDAABBB'));