将修改后的数组作为参数传递给函数

时间:2012-08-24 21:11:30

标签: javascript jquery

我一直在努力解决下面的代码问题,试图弄清楚如何通过每次点击将数据传递给函数。

问题是,只要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”
  3. 预期结果:警报窗口显示“link1,link1,link2”

    实际结果:警告窗口显示“link1,link2,link1,link2”

1 个答案:

答案 0 :(得分:1)

您按原样推送ids数组,但稍后会更改。您应该使用slice推送它的副本。类似的东西:

passedItems.push(ids.slice());

另外,我无法理解if条款的必要性。如果该项目已存在,则不要添加;或者我错过了什么?

请参阅DEMO