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 个不同的函数,它们相互冲突。

我正在为 LG TV 开发一个应用程序。LG 电视有自己的库。现在在我的函数中,我设置了所选元素的样式。当我关注所选元素时,我激活了 LG TV onFocus 侦听器,该侦听器反过来控制所选样式。

因此,当我循环第二个或第三个孩子时,我再次设置已清除元素的选定样式。TLDR,但这就是循环如何相互冲突。一个人打断了另一个人的工作。

代码不是我写的。我进入了一个现有的项目,我还没有编写这个函数,所以我不能只删除 Focus() 函数。

4

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

为什么要循环两次?更容易做到:

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