2012-08-24 159 views
2

我一直在努力处理下面的那段代码太久,试图弄清楚如何将每次单击修改的数组传递给函数。将修改过的数组作为参数传递给函数

问题是只要clickedLinks数组被修改,它就会影响shoplist函数中的passedLinks数组。

我甚至得到了a great explanation为什么发生这种情况,但我无法正确应用到我的例子。我尝试在不同的点清除数组,但是没有成功。我开始怀疑我的代码的整个逻辑是否有缺陷。

任何帮助,将不胜感激。

下面是代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> 
<html> 
    <head> 
    <title> 
     Test 1 
    </title> 
    <script src="http://code.jquery.com/jquery-latest.js" type= 
    "text/javascript"> 
</script> 
    </head> 
    <body> 
    <div class="items"> 
     <ul> 
     <li> 
      <a href="#" id="link1">Link 1</a> 
     </li> 
     <li> 
      <a href="#" id="link2">Link 2</a> 
     </li> 
     <li> 
      <a href="#" id="link3">Link 3</a> 
     </li> 
     <li> 
      <a href="#" id="link4">Link 4</a> 
     </li> 
     </ul> 
    </div> 

<script type="text/javascript"> 
    var clickedLinks = []; 
    var passedItems = []; 


    // Collect clicked link IDs into an array and pass the array as an argument to shoplist() 
    $('.items a').click(function() { 

    if (clickedLinks.indexOf(this.id) != -1) { 
     var linkIndex = clickedLinks.indexOf(this.id); 
     clickedLinks.splice(linkIndex, 1); 
    } else { 
     clickedLinks.push(this.id); 
    } 

    shoplist(clickedLinks); 

    }); 


    function shoplist(ids) { 
     passedItems.push(ids); 
     alert(passedItems); 
    } 
</script> 
</body> 
</html> 

步骤:

  1. 点击 “链接1”
  2. 点击 “链接2”

预期结果:警报窗口显示“lin K1,链接1,链接2"

实际结果:告警窗口‘链接1,链接2,链接1,链接2’

+2

+1对于**预期结果**和**实际结果**,看一看。 – sQVe

+0

你能更明确地说明你想做什么吗? – MalSu

回答

1

您正在推动ids阵列是,但后来它被后来改变。您应该使用slice推送它的副本。例如:

passedItems.push(ids.slice()); 

此外,我不明白if条款的需要。如果该项目已经存在,就不要添加它;或者我错过了什么?

参见DEMO

+0

感谢您的回答。这是否意味着使用slice()方法创建数组的静态副本?顺便说一下,如果这个块与这个问题无关,我可以把它排除在外。 – finspin

+0

['slice()'](http://www.w3schools.com/jsref/jsref_slice_array.asp)方法返回数组的浅拷贝作为新数组。你可以对其执行'push','pop'和所有其他数组操作。 – mhusaini

相关问题