1

関数本体内の 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"]
4

3 に答える 3

0

@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'))

この例では、現在の値を次の値と照合する代わりに、現在の値を前の値と照合します。

于 2019-11-13T15:33:23.967 に答える
0

@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'));

于 2019-11-13T15:34:18.450 に答える