【问题标题】:Remove a specific element in an array删除数组中的特定元素
【发布时间】:2016-11-11 21:31:30
【问题描述】:

当数组元素与字符串的其他元素部分匹配时,我需要从数组中删除一个元素,删除该元素。

例如,

var res1 = [
  " Proj -> Phase-1 -> Tower-1 -> Floor-2 ", 
  " Proj -> Phase-2 ", 
  " Proj -> Phase-2 -> Tower-1 " ];

即如果我的

res1[2]="Proj->Phase-2->Tower-1" 

res1[1]="Proj->Phase-2"

res1[1] 部分匹配 res1[2]。所以我需要删除res1[2]。之后我想要剩余的数组值。但它不能正常工作。

这是我尝试过的,但没有得到我期望的结果:

for (i = 0; i < res1.length; i++) {
    for (j = 0; j < res1.length; j++) {
        if (res1[i] != res1[j]) {
            if (res1.indexOf(res1[j]) === 0) {
                console.log(res1);
                console.log(res1[j]);
                delete res1[i];
            }
        }
    }
}

即如果 string1 "Proj->Phase-2" 恰好在 string2 "Proj->Phase-2->Tower-1" 中,则需要删除 string2。即使一个 string3 "Proj->Phase-1->Tower-1" 与 string1 相比,也不完全相同。所以它不应该被删除

【问题讨论】:

  • for(i=0;i
  • @Sahithya 您还需要将代码(您尝试过的)放入原始问题中。此外,目前尚不清楚您打算做什么。您是否希望最终结果具有唯一的前缀?在这种情况下,您的所有项目都具有与proj 相同的前缀,难道不应该确保删除所有其他项目吗?请为每个测试用例分享足够的测试数据和预期的输出

标签: javascript arrays


【解决方案1】:

我会使用String.includes()

var res1 = [
  " Proj -> Phase-1 -> Tower-1 -> Floor-2 ", 
  " Proj -> Phase-2 ", 
  " Proj -> Phase-2 -> Tower-1 " ];    

for (var i = 0; i < res1.length; i++) {
  for (var j = i + 1; j < res1.length; j++) {
    if (res1[j].includes(res1[i])) {
      res1.splice(j, 1);
      j--; // Splice deletes the element so all index shifts, need to recheck the same element
    }
  }
}

console.log(res1)

【讨论】:

  • 谢谢。这正是我需要的。 :)
【解决方案2】:

你快到了。只需检查索引是否不同

i !== j

然后如果一个字符串在另一个字符串中

res1[i].indexOf(res1[j]) === 0
//  ^^^

然后使用Array#splice 删除元素。

虽然 foo 循环递增 1 并且外部循环的实际元素被删除,但您需要更正索引 i。那么break是必要的,因为结构改变了,需要用j初始化一个新的循环。

var res1 = [" Proj -> Phase-1 -> Tower-1 -> Floor-2 ", " Proj -> Phase-2 ", " Proj -> Phase-2 -> Tower-1 "],
    i, j;

for (i = 0; i < res1.length; i++) {
    for (j = 0; j < res1.length; j++) {
        if (i !== j && res1[i].indexOf(res1[j]) === 0) {
            res1.splice(i, 1);
            i--;
            break;
        }
    }
}

console.log(res1);

【讨论】:

  • 如果相同元素的顺序不同,这将不起作用,例如 ` var res1 = [" Proj -> Phase-2 ", " Proj -> Phase-1 -> Tower-1 - > Floor-2 ", " Proj -> Phase-2 -> Tower-1 "]`
【解决方案3】:

使用 EcmaScript2015 的解决方案:

var res1 = [
  " Proj -> Phase-1 -> Tower-1 -> Floor-2 ", 
  " Proj -> Phase-2 ", 
  " Proj -> Phase-2 -> Tower-1 " ];

res1 = res1.filter((x, i) => res1.every((y, j) => i==j || x.indexOf(y)));
  
console.log(res1);

或者没有箭头功能的相同:

var res1 = [
  " Proj -> Phase-1 -> Tower-1 -> Floor-2 ", 
  " Proj -> Phase-2 ", 
  " Proj -> Phase-2 -> Tower-1 " ];

res1 = res1.filter(function(x, i) {   
  return res1.every(function(y, j) {
    return i==j || x.indexOf(y);
  })
});

console.log(res1);

【讨论】:

    【解决方案4】:

    我不确定这是否是您需要的结果,但在这里,您必须在 if 构造中使用的命令是:

    res1[j].indexOf(res1[i])==0
    

    所以整个程序是:

    for(i in res1){
      for(j in res1){
        if(i!=j){
          if(res1[j].indexOf(res1[i])==0){
           delete res1[j];
          }
        }
      }
    }
    alert(res1);
    

    希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 2019-06-03
      • 1970-01-01
      • 2021-04-21
      • 2016-08-02
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多