我有一个数组[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()函数。
答案 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
}
}