2016-11-23 37 views
1

我需要在数组中找到子字符串。 如果我有一个数组:["abc", "abcd", "abcde", "xyz"],该方法应返回数组成员:"abc", "abcd", "abcde",因为每个成员都是另一个的子字符串或超字符串,但它应该排除“xyz”。 JavaScript中最好的方法是什么?在数组中找到子字符串 - javascript

+0

这将是这样的结果: 'AB', 'ABC', 'BC', 'ABBC', 'BB', '羊毛', '交流',” abbc','abbbc','bbc'] - desierd逻辑没有明确定义 – yossico

+0

['ab','abc','bc','abb','ababc','abbbc','bbc'],因为在这里你不会找到任何完全不同的字符串数组元素 –

+0

为什么不是bb?它是其他 – yossico

回答

4

使用Array#filter

var arr = ["abc", "abcd", "abcde", "xyz"]; 
 

 
console.log(arr.filter(function(el) { 
 
    return el.indexOf('abc') > -1; 
 
}));

编辑:使用,如果你想使基础的过滤一些值阵列相对于当前元素Array#some

var arr = ["abc", "abcd", "abcde", "xyz"]; 
 

 
console.log(arr.filter(function(el, index) { 
 
    return arr.some(function(e, i) { 
 
    if (i !== index) { 
 
     return e.indexOf(el) > -1 || el.indexOf(e) > -1; 
 
    } 
 
    return false; 
 
    }) 
 
}));

+0

这是不期望的,我需要动态地比较每个元素与其他每个元素,看看哪一个都有相互之间的子串,你给出的解决方案在每个数组元素内找到预先给定的文本 –

+0

@ShyamSundarR检查编辑.. – Rayon

+0

谢谢,这是预期的结果,但无论如何将未来检查的已计算值用于存储它们将有助于改善运行时间? –

1

您只需使用2个嵌套循环,但复杂度为O(n^2)

function find_substrings(arr) { 
 
    var res = []; 
 
    for (var i=0; i<arr.length; i++) { 
 
     for (var j=0; j<arr.length; j++) { 
 
      if (i !== j && (arr[i].indexOf(arr[j]) > -1 || arr[j].indexOf(arr[i]) > -1)) { 
 
       res.push(arr[i]); 
 
       break; 
 
      } 
 
     } 
 
    } 
 
    return res; 
 
} 
 
var arr = ["abc", "abcd", "abcde", "xyz"]; 
 
console.log(find_substrings(arr)); 
 

+0

没有其他增强是可能的? –

+0

你可以看看xD上方的编辑答案。其实它会和我的答案一样 –

0

你可以使用一些优化的循环与捷径和对象的物品。

var data = ["abc", "abcd", "42", "abcde", "422", "xyz", "q", "1q"], 
 
    result = function (array) { 
 
     var i, j, 
 
      r = {}; 
 

 
     for (i = 0; i < array.length - 1; i++) { 
 
      if (r[array[i]]) { 
 
       continue; 
 
      } 
 
      for (j = i + 1; j < array.length; j++) { 
 
       if (r[array[j]]) { 
 
        continue; 
 
       } 
 
       if (array[i].indexOf(array[j]) !== -1 || array[j].indexOf(array[i]) !== -1) { 
 
        r[array[i]] = true; 
 
        r[array[j]] = true; 
 
       } 
 
      } 
 
     } 
 
     return array.filter(function (a) { return r[a]; }); 
 
    }(data); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }