【问题标题】:Delete arrays generated by a function删除函数生成的数组
【发布时间】:2015-08-22 18:31:11
【问题描述】:

我创建了一个函数,每次更改滑块的值时都会调用该函数。问题在于该函数生成一个数组,该数组稍后会传递给其他函数。到目前为止,一切都很好,但是滑块可以根据用户的需要进行多次调整,正如我所说,这会触发生成数组的函数,这意味着我可以获得数百甚至数千个数组,而我实际上需要最后一个.这是我的代码:

function tg() {

    $(".dot").remove();

    var p, x, y, xo, yo, agl, spd, g, t = 1, isin2, angle1, n = 0, i = 1;
    var m = [];

    p = $("#ba").position();
    xo = p.left;
    yo = p.top;

    spd = $("#spd").val();
    agl = $("#agl").val();
    g = $("#g").val();
    angle1 = formula;

    isin2 = true;

    while (isin2) {
        y = formula;
        x = formula;

        m.push([x, y]);

        //...

        t++;
        isin2 = isin(x, y);

    }
    if (isin2 == false) {
        $(".dot").last().remove();
        m.pop([x, y]);
        console.log(m);
    }
    activate(m);
}

滑块来了,我实际上只给出了其中一个,因为其余两个是绝对副本,它们只是在处理其他变量。

$(document).ready(function(){
    $("#slagl").slider({
        min:0,
        max:89,
        value:15,
        range:"min",
        slide: function(event, ui){
            $("#agl").val(ui.value); 
            tg();
        }
    });

您可以很容易地看到它只是堆积新的和新的阵列而没有清理其他阵列。目标是在每次调用函数时以某种方式删除所有其他冗余数组,在幻灯片上制作并只保留最后一个。

【问题讨论】:

  • m.push([x,y]); 如果您只需要一个元素,则将其直接应用于 m 或第一个元素,或者只保留最后 10 个左右 ...
  • 不,我需要存储在数组中的一堆元素,而不是一堆包含一堆元素的数组,因为它发生了。即使是最轻微的滑块滑动也会附加 5-6 个新数组。我想,浏览器会将它们保留在某个地方,但我需要找到这个地方在哪里以及如何访问它。
  • 提示setTimeout
  • “即使是最轻微的滑块滑动也会附加 5-6 个新数组” - 听起来你需要去抖动 - stackoverflow.com/q/24004791/1837472
  • @Felipe Brahm,是的,但问题是该算法将这些数组中的每一个传递给以下函数,而它只需要获取最后一个,这使我的球运行 1000,形象地说,坐标,直到它到达包含正确数组的正确(最后一个)数组。这就是让我认为 idk、删除或阻止冗余函数的最佳位置应该发生在 tg() 中的原因,因为它生成、打包和发送所需的值。

标签: javascript jquery arrays google-chrome


【解决方案1】:

在与 OP 的私人对话中,我们发现这些数组实际上是正确生成的。问题在于activate(m);,每次滑块更改时都会调用它。在activate() 中,一个点击事件被分配给一个按钮,这导致每次更新都会堆积冗余点击事件。因此,每当单击按钮时,它也会使用数组的旧值执行其代码。

【讨论】:

    【解决方案2】:

    请使用滑块的“更改”功能。与在每个像素移动时调用的“滑动”回调相比,这仅在用户释放滑块的处理程序时调用一次。

    【讨论】:

    • 您可以通过一些链接和参考 sn-ps 来改进您的答案。
    • 这是我想做的事情之一,因为我完全同意这会大大减少数组,但是以前的数组仍将包含在浏览器/程序中的某个位置,我需要访问它们并摆脱它们。很好,建议不过,我现在就应用它。 :) 我们很接近了..
    • * 这减少了 90% 的数组数量,成功了,现在我们必须删除最后一个。我将尝试更准确地解释它,这些数组是我的“球”必须经过的点的轨迹。在每张幻灯片上,我创建了这些点的新轨迹,当我做 >1 个新的轨迹时,球开始跟随第一个创建的轨迹,然后是第二个,直到它到达最后一个,这使得它很容易出错:D跨度>
    • 如果这些数组是私有的并在 tg() 函数中定义,那么你真的不必担心内存泄漏。一旦程序执行从该 tg() 函数中出来,这些将自动进行垃圾收集。只是为了交叉检查它;尝试将“m”放在浏览器控制台中,看看是否有任何值打印出来。谢谢。
    • hmm,这听起来很奇怪,那么也许这是一个逻辑错误...看看我设置幻灯片时发生了什么:更改:...只需将此图片与我发布的上面的图片进行比较主题... [IMG]i60.tinypic.com/2wqrjo9.png[/IMG]这是经过3次调整后,两个来自滑块+最初的一个。问题仍然存在,它继续堆积数组。
    【解决方案3】:

    您应该使用滑块change 功能或使用一些去抖动功能:

    $(document).ready(function(){
      var timer;
      $("#slagl").slider({
        min:0,
        max:89,
        value:15,
        range:"min",
        slide: function(event, ui){
          $("#agl").val(ui.value);
          if(timer) {
            clearTimeout(timer);
          }
          timer = setTimeout(tg, 500);
        }
      });
    });
    

    将值 500 更改为更适合您的用例的值。

    【讨论】:

    • 是的,这对我有很大帮助,因为它减少了很多数组,但它仍然将以前生成的数组保存在某个地方,并且在更改滑块时我需要摆脱以前计算的数组并放置具有从其位置上的滑块获得的新值的新值。
    • it's still saving the previously generated array somewhere 是什么意思?该数组未保存在任何地方。它会被 GC 自动删除。你能解释一下你的意思吗?
    • 好的,我有滑块,我用它们操纵 vars ang、spd 和 g,我用它们计算 x=..,y=... 因为这个过程是循环的,所以我只是推新计算 x 和 y,因为它们是时间 (t) 的函数,一个数学函数。当我整理完 x 和 y-s 后,我得到一个数组,它似乎是我的射弹的“路径”,我将把它发送给一个实现沿这条路径“运动”的函数。从我所见,我可以告诉你,如果我调整一个或两个或所有滑块并点击“播放”,球会开始沿着第一条路径,然后是第二条并继续
    • 跟踪滑块调整顺序中构建的所有轨迹。我想放置球,从滑块调整它的值,然后单击播放它以仅遵循一条路径,而不是从所有其他路径开始,最终到达我刚刚设置的路径...
    • 你告诉我的意思是每次我调用一个函数,不管我在编译器之前做了多少次,或者它会清理所有以前使用的数组,在我的情况下,并且会创建新的,就好像我是第一次运行脚本一样,如果我做对了。如果就像你说的那样,这是个好消息,那么……那些滑块在每次更改时都会调用 tg(),那么为什么当 CG 应该已经清理它们时,movement() 会读取所有先前的滑块调整?如果你只是想法,而不是例子,我很乐意阅读它们,我也会考虑这个:)
    猜你喜欢
    • 1970-01-01
    • 2012-04-07
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多