js循环结构的算法设计

时间:2013-02-28 18:48:20

标签: javascript

我有一个数组[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 

coffe

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循环,因为我的框架有一些限制。

如何改进此代码?

谢谢。

解释 - 我需要这种设计的原因是由于两个不同功能的重复调用,这两个功能相互冲突。

我正在为LG TV开发一款应用。 LG TV拥有自己的图书馆。现在,在我的函数中,我设置了所选元素的样式。当我专注于所选元素时,我激活LG TV onFocus监听器,然后控制所选择的样式。

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

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

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

for( var i=0, l=array.length; i<l; i++) {
    if( item == chosenEl) {
        // set styles
    }
    else {
        // clear styles
    }
}