2016-11-23 6 views
1

Ich muss die Teilstrings innerhalb von Arrays finden. Wenn ich ein Array habe: ["abc", "abcd", "abcde", "xyz"], sollte die Methode mir die Array-Mitglieder zurückgeben: "abc", "abcd", "abcde" wie jeder ist ein Teilstring oder ein Superstring des anderen, aber es sollte "xyz" auszuschließen. Was ist die bestmögliche Methode in Javascript?Finden von Substrings innerhalb von Arrays - Javascript

+0

was das Ergebnis dieser sein wird: [ 'ab', 'abc', 'bc', 'abbc', 'bb', 'abb', 'ac',‘ ababc ',' abbbc ',' bbc '] - die Desierd Logik ist nicht gut definiert – yossico

+0

[' ab ',' abc ',' bc ',' abb ',' ababc ',' abbbc ',' bbc '], wie hier finden Sie keine völlig anderen String-Array-Elemente –

+0

Warum nicht bb? es ist substring von anderen – yossico

Antwort

4

Verwenden Array#filter

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

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

Edit: Verwenden Array#some wenn Sie Filter machen wollen anhand von einige Werte im Array in Bezug auf aktuelle Element!

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

Dies wird nicht erwartet, ich muss jedes Element dynamisch mit jedem anderen Element vergleichen und sehen, welche alle Teilstrings untereinander haben, die Lösung, die Sie gaben, findet einen vorgegebenen Text innerhalb jedes Array-Elements –

+0

@ShyamSundarR Überprüfen Sie die Bearbeitung .. – Rayon

+0

Danke, das war das, was erwartet wurde, aber trotzdem den bereits berechneten Wert für die zukünftigen Checks zu verwenden, indem man sie speichert, würde das zur Verbesserung der Laufzeit beitragen? –

1

Sie können einfach zwei verschachtelte Schleifen verwenden, aber die Komplexität ist 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

keine andere Verbesserung möglich ist ?? –

+0

Sie können die editierte Antwort über xD betrachten. Eigentlich würde es genauso funktionieren wie meine Antwort –

0

Sie einige optimierte Loops verwenden könnte mit Abkürzung und ein Objekt für die Gegenstände.

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; }

Verwandte Themen