在键/值数组中覆盖密钥(如果存在)

时间:2014-08-16 18:51:04

标签: javascript jquery arrays

我允许用户通过点击突出显示表格中的行。

当他们点击它们时,会调用HighToggle()。

HighToggle()检查以查看td的bgcolor是否与突出显示颜色匹配,并突出显示或取消突出显示。

function HighToggle(cObj,vid,vColor,hColor) {
    if ((vColor == hColor)) {
      $(cObj).css('background-color','#FFFFFF'); // un-highlight
      vx.push({'id' : vid, 'status' : 'off'});
    } else {
      $(cObj).css('background-color','#' + Highlighter.Hex); // highlight
      vx.push({'id' : vid, 'status' : 'on'});
    }
}

将这些存储在数组中非常重要,因为我有记录集导航,可以删除行(从视图中)并通过JSON加载新行。否则,当我想将数据提交给服务器时,我可以循环遍历表行并构建预先提交的数组。

所以,这样可以正常工作,除非它在每次突出显示或未突出显示某些内容时添加重复的ID,因此它可能如下所示:

1: on, 7: on, 7: off, 2: on, 4: on, 1: off, 3: on, 1: on, 2: off.

这只是一团糟。

按照上面导致该数组的相同点击过程,我最终想要的是......

1: on, 7: off, 2: off, 4: on, 3: on

如果结果集只有10行,则行从不与(5,6,8,9,10)交互,根本不需要在数组中有条目。 我正在寻找一种快速的方法来搜索我的数组并覆盖行(如果存在的话)。

我想到了一个我尚未尝试实施的解决方案,因为我觉得可能有更好的东西。

我可以制作一个单独的数组,让我们说它被称为vindexes。 Vindexes可以使用作为vid变量传递的ID,如此...

vindexes[vid] = vx.length;

HighToggle可以检查vindexes [vid]是否存在,如果存在,则使用该id覆盖而不是vx.push。

它会起作用(不会吗?)但它重新发明轮子了吗?有更快的方法吗?这个功能将在每一页上大量使用。

我已经找到了grep函数,因为我使用的是jQuery,但我不认为grep适用于我,因为我想知道找到ID的位置的索引。

感谢您的任何建议。

编辑:这是我自己设计的内容,但我认为答案是更优雅,更明智的解决方案。

function HighToggle(cObj,vid,vColor,hColor) {
    vid = Number(vid);
    if (!(vid in vi)) {
      inIndex = vx.length;
    } else {
      inIndex = vi[vid];
    }

    if ((vColor == hColor)) {
      $(cObj).css('background-color','#FFFFFF');
      vi[vid] = inIndex;
      vx[inIndex] = {'id' : vid, 'status' : 'off'};
    } else {
      vi[vid] = inIndex;
      $(cObj).css('background-color','#' + Highlighter.Hex);
      vx[inIndex] = {'id' : vid, 'status' : 'on'};
    }
}

我的解决方案,答案对我的使用都有效,但也许其他人会遇到这种情况,并从我提供的代码中受益。

1 个答案:

答案 0 :(得分:3)

您可以使用对象:

var vx = {};

function HighToggle(cObj,vid,vColor,hColor) {
    if ((vColor == hColor)) {
      $(cObj).css('background-color','#FFFFFF'); // un-highlight
      vx[vid] = "off";
    } else {
      $(cObj).css('background-color','#' + Highlighter.Hex); // highlight
      vx[vid] = "on";
    }
}

然后,如果您以后需要一个数组(用于提交到服务器等):

var vxArray = [];
for (var key in vx) {
  vxArray.push({id: key, status: vx[key]});
}