0

配列を取得しました[1,2,3,4]

私は最初に選ばれた[2]に蹂躙し、彼のスタイルを設定し、そして他の子供たちに蹂躙して彼らのスタイルをリセットした後よりも必要です。

現時点では、私のアルゴリズムは次のとおりです。

for item in array
    if item == chosenEl
        set chosen classes
for item in array
    if item != chosenEl
        reset chosen classes for the rest of the children 

またはコーヒー

for item in @array
    if item.element is element
        item.selected = true
        item.element.classList.add @selectedClass
        item.element.focus()
for item in @array
    if item.element isnt element
        item.selected = false
        item.element.classList.remove @selectedClass

フレームワークにいくつかの制限があるため、単純なforElseループとしてではなく、そのような関数を設計する必要があります。

このコードを改善するにはどうすればよいですか?

ありがとうございました。

説明-この設計が必要な理由は、2つの異なる関数の呼び出しが重複していて、互いに競合しているためです。

LGTV用のアプリを開発しています。LGTVには独自のライブラリがあります。今、私の関数で、選択した要素のスタイルを設定しました。選択した要素に焦点を合わせると、LG TV onFocusリスナーがアクティブになり、LGTVonFocusリスナーが選択したスタイルを制御します。

したがって、2番目または3番目の子をループするときに、クリアされた要素の選択されたスタイルを再度設定します。TLDRですが、それがループが互いに競合する方法です。一方が他方の作業を中断します。

コードは私が書いたものではありません。既存のプロジェクトに参加しましたが、この関数を作成したことがないため、Focus()関数を削除することはできません。

4

2 に答える 2

2

2回ループする代わりに、以下のコードを検討してください

for item in array
{
    if item == chosenEl
    {
        set chosen classes
        continue; <--use this to return to next iteration without executing next statements
    } 
   reset chosen classes for the rest of the children
}

O(n)+ O(n)ではなくO(n)になります

編集:

申し訳ありませんが、あなたの説明がわかりませんでした。繰り返し呼び出すことができる関数だけが必要な場合は、選択した値を渡してresetStylesを複数回呼び出します。正確なデータ型を提供していないため、整数と想定していることに注意してください。

<script>
var resetStyles = function(selecteditem)
{
   var arr = [1,2,3,4];
   for(var i=0; i < arr.length; i++)
   {
      if(arr[i] == selecteditem)
      {
        //set class here

        continue;
      }
      //remove class here
   }
};
resetStyles(2);//call this by changing the values
</script>
于 2013-02-28T18:52:52.100 に答える
1

なぜあなたは2回ループしているのですか?ただ行う方がはるかに簡単です:

for( var i=0, l=array.length; i<l; i++) {
    if( item == chosenEl) {
        // set styles
    }
    else {
        // clear styles
    }
}
于 2013-02-28T18:51:30.867 に答える