【问题标题】:Remove items from based of substring in array jquery从数组jquery中的子字符串中删除项目
【发布时间】:2016-09-06 20:24:44
【问题描述】:

这似乎是一个非常新手的问题,但我现在正在努力解决这个问题并寻求帮助。

这是 JavaScript 中的示例数组

var SelectedFilters =  ["[size:12:12]","[size:12:12]","[size:13:13]","[size:14:14]", "[color:14:14]","[color:14:14]","[type:14:14]","[type:14:14]"];

现在我希望根据搜索词从这个数组中删除某些项目,现在搜索词只包含字符串的一部分,例如

var searchTerm1 = 'size' 
var searchTerm2 = 'color'

我已经尝试了以下代码,但它不起作用:

var i = SelectedFilters.indexOf(searchTerm1);
    if (i != -1) 
     {
     SelectedFilters.splice(i, 1);
     }

我也尝试过 for 循环,迭代所有项目,但再次搜索失败,因为它无法匹配“大小”或“颜色”

我在看什么:如果使用 searchterm1,结果输出将是:

["[color:14:14]","[color:14:14]","[type:14:14]","[type:14:14]"];

如果使用 searchterm2,结果输出应该是:

["[size:12:12]","[size:12:12]","[size:13:13]","[size:14:14]","[type:14:14]","[type:14:14]"];

如果有人能解决这个难题,那就太好了,同时我也在努力寻找解决方案。

【问题讨论】:

  • 你真的需要对原来的Array进行变异,还是新的Array可以?
  • 要求不允许我创建一个新数组,因为其他答案建议使用 filter 函数,因为这将创建一个新数组
  • 仅供参考,您的尝试没有成功,因为数组上的.indexOf() 会寻找完全匹配的。因此,您需要遍历数组并分别对每个字符串执行测试。
  • 好的,我发布了一个变异原始的解决方案。

标签: javascript jquery arrays search


【解决方案1】:

可以使用filter数组方法

var searchTerm = "size";
SelectedFilters  = SelectedFilters.filter(function(val){
  return val.indexOf( searchTerm ) == -1;
}); 

【讨论】:

    【解决方案2】:

    您可以使用Array#filter

    var searchTerm1 = 'size';
    var result = SelectedFilters.filter(v => !v.includes(searchTerm1));
    
    console.log(result); //["[color:14:14]","[color:14:14]","[type:14:14]","[type:14:14]"];
    

    如果你想改变原来的数组那么做,

    var SelectedFilters = ["[size:12:12]", "[size:12:12]", "[size:13:13]", "[size:14:14]", "[color:14:14]", "[color:14:14]", "[type:14:14]", "[type:14:14]"];
    
    var searchTerm1 = 'size',cnt = 0, len = SelectedFilters.length - 1;
    while (cnt <= len) {
      if (SelectedFilters[len - cnt].includes(searchTerm1)) SelectedFilters.splice(len - cnt, 1);
      cnt++;
    }
    
    console.log(SelectedFilters);
    

    DEMO

    【讨论】:

      【解决方案3】:

      您的尝试没有成功,因为数组上的.indexOf() 会寻找完全匹配的内容。

      由于根据您的问题和评论,您需要改变原始数组,因此您应该遍历数组并单独测试每个字符串,然后在每次找到需要删除的字符串时调用.splice()

      var SelectedFilters =  ["[size:12:12]","[size:12:12]","[size:13:13]","[size:14:14]", "[color:14:14]","[color:14:14]","[type:14:14]","[type:14:14]"];
      
      var searchTerm1 = 'size' 
      var searchTerm2 = 'color'
      
      for (var i = SelectedFilters.length-1; i > -1; i--) {
        if (SelectedFilters[i].startsWith(searchTerm1, 1)) {
          SelectedFilters.splice(i, 1)
        }
      }
      
      document.querySelector("pre").textContent = 
        JSON.stringify(SelectedFilters, null, 2)
      &lt;pre&gt;&lt;/pre&gt;

      上面使用的循环是相反的。这一点很重要,因为每次我们执行 .splice() 时,数组都会重新索引,所以如果我们继续前进,我们最终会跳过要删除的相邻项目。

      .startsWith() 方法检查字符串是否以给定的搜索词开头。我将第二个参数的值传递给1,以便它开始搜索第二个字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 2017-02-10
        • 1970-01-01
        • 2012-09-15
        • 2015-09-27
        • 1970-01-01
        • 2012-03-17
        相关资源
        最近更新 更多