【问题标题】:Why does .splice always delete the last element?为什么 .splice 总是删除最后一个元素?
【发布时间】:2013-08-20 15:05:36
【问题描述】:

在javascript中,有两个数组:tags[]和tags_java[]。我使用.splice 删除两个数组中相同索引的某些项目。 tags[] 工作正常,但 tags_java 不行,它似乎总是删除最后一项。
这是代码和the jsfiddle link。

var tag = $(this).text();
var index = $.inArray(tag, tags);
    tags.splice(index,1);
    tags_java.splice(index,1); 

【问题讨论】:

  • 您能否在对它们中的任何一个执行切片之前提供/检查索引、标签数组和 tags_java 数组的值..?
  • 您的标签永远不会在数组中 - 附加的 × 显示为跨度文本的一部分,因此 $.inArray() 始终返回 -1。

标签: javascript


【解决方案1】:

不,两者都不起作用,因为您实际上并没有找到正确的标签索引。

为什么不呢?因为$(this).text() 包括您添加的删除标记,× - 例如“早×”。由于这不在您的 tags 数组中,因此 index 将为 -1。 tags.splice(-1, 1); 将从数组末尾删除 1 项。

一般来说,使用演示文本(即标签元素的文本)作为数据(例如,使用该文本作为数组中的查找值)从来都不是一个好主意。当演示文稿中的某些内容发生变化时,它很可能会被破坏 - 就像这里一样。所以一个建议是存储数据(你需要查找标签) as 数据 - 例如使用 jQuery 提供的 data() API - 即使它看起来是多余的。

这是一个简单的示例 - 只需添加/替换两行,我用以“JT”开头的 cmets 进行了标记:JSFiddle

现在,我们不是通过$(this).text() 查找,而是通过$(this).data() 存储的数据值“tagValue”进行查找 - 这样,查找值仍然绑定到元素,但我们没有依赖于演示文本。

【讨论】:

  • 谢谢@JimmiTh。但是我该如何解决呢?如何从文本中修剪“&times”?
  • 您可以使用var tag = $(this).text(); tag = tag.substr(0, tag.length - 1); 删除×,但如第二段所述,这很容易出错。通过存储数据 as 数据来添加一个示例来回答我的意思。
  • 但是现在查找值与内容“'下午','Morning”,因为如果我将它们存储为“1,2..”之类的数字,我不知道如何在另一个页面中检索信息。有什么建议吗?谢谢。
  • 不太清楚你的意思 - JSFiddle(更新)中的代码完全像你的原始代码一样工作 - 除了它在标签元素上使用data(),而不是text().
  • 谢谢@JimmiTh,效果很好。我会好好看看.data。这是个好主意。我的意思是在您存储这些数据值之后,例如在这种情况下为“300,301,302”,我如何才能在具有特定内容和颜色的另一个页面中显示它们。这更清楚了吗?
【解决方案2】:

如果tag 不在tags 数组中,$.inArray 将返回-1,这将导致最后一项被删除。

You have to make sure that the item is actually in the array.

【讨论】:

    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 2021-04-19
    • 2021-07-14
    相关资源
    最近更新 更多