2017-01-10 2 views
2

Angenommen, ich habe ein Array als solches;Wie entfernen Sie eine bestimmte Menge von Zeichen aus einem Array von Zeichenfolgen in Javascript oder AngularJS, so dass es nicht dupliziert wird?

$scope.array = ["ABC", "ABCDEF", "ABCDEFGHI", "ABCAFGKJA"]; 

ist es möglich, es als solches zurückzugeben ?;

$scope.array = ["ABC", "DEF", "GHI", "KJ"]; 

Entschuldigung, wenn die Frage nicht zu klar ist, immer noch lernen die Terminologien. Prost!

+0

Ist es immer auf diese Weise sortiert werden, oder es kann [ "ABCDEFGHI", "ZCVZ", "ABC", "ABCDEF"] als Gut? Befinden sich die Duplikate immer am Anfang der Zeichenfolge oder können sie auch in der Mitte der Zeichenfolgen liegen? –

+0

@OriDrori hey da, danke für die schnelle Antwort! Wie auch immer, es ist sequentiell, da ich versuche, eine Aussage wie diese ((A | B | C) &D); zu brechen und sie basierend auf der Auswertung als solcher ["A | B | C", "(A | B | C) &D"]; Also, was ich im Gegenzug wollen wäre: ["A | B | C", "() &D"]; etwas wie das. –

+0

@UdhayanNair - unter Berücksichtigung Ihrer Kommentare aus anderen Antworten habe ich meine Antwort mit aktualisiert Ihr Beispiel – Nope

Antwort

2

Eine Version mit String.prototype.replace() und Array#reduce, für innere und äußere Schleife.

In der äußeren Schleife ist es notwendig, die tatsächlichen reduzierten Elemente zu iterieren, um die tatsächliche Zeichenfolge zu reduzieren.

function getParts(r, a) { 
 
    r.push(r.reduce(function (q, b) { 
 
     return q.replace(b, ''); 
 
    }, a)); 
 
    return r; 
 
} 
 

 
console.log(["ABC", "ABCDEF", "ABCDEFGHI"].reduce(getParts, [])); 
 
console.log(["A|B|C", "(A|B|C)&D"].reduce(getParts, [])); 
 
console.log(["abc", "abch", "def", "abchdefg"].reduce(getParts, [])); 
 
console.log(["A|B|C", "(A|B|C)&D", "E|F|G", "((A|B|C)&D)&(E|F|G)"].reduce(getParts, []));
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Bei der Verwendung von '[" ABC "," ABCDAEF "," ABCDEFGHI "]' entfernt es nicht die anderen 'A' Zeichen.Ich nehme an, das ist was OP will, angesichts der Phrasierung doppelte Zeichen zu entfernen und nicht Strings. Ich hatte das gleiche Problem in meiner Lösung. - Obwohl ich könnte falsch liegen angesichts der Antwort von OP in seinen Kommentaren. – Nope

+0

ohne weitere Beispiele, es ist nur Spekulation. –

+0

hey da @Fran! yeah, was du gesagt hast ist richtig, ich will jemals y Vorkommen von A wird entfernt, ich denke, ich kann an Ninas Methode arbeiten, denn sie scheint ziemlich ordentlich zu sein. –

0

Taking Ihre Bemerkungen Rechnung aus anderen Antworten, wenn Sie alle Vorkommen der Zeichen unabhängig davon, wo in der Kette sie positioniert entfernen möchten, sollte die folgende arbeiten.

Ja, es gibt wahrscheinlich eine Möglichkeit effizienter zu schreiben, aber das unten scheint zu funktionieren.

var x = ["A|B|C", "(A|B|C)&D", "E|F|G", "((A|B|C)&D)&(E|F|G)"]; 
 
// Expected Result ["A|B|C", "D", "E|F|G", ""] 
 
var existingChars = []; 
 
var reg; 
 

 
for (var i = 0; i < x.length; i++) { 
 
    for (var j = 0; j < existingChars.length; j++) { 
 
    existingChars[j] = existingChars[j].replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 
 
    reg = new RegExp(existingChars[j], 'g'); 
 
    x[i] = x[i].replace(reg,'').replace(/[&\)\(]+/g, ''); 
 
    } 
 
    
 
    existingChars = existingChars.concat(x[i].split('')); 
 
} 
 

 
console.log(x);

+0

danke für die Antwort so schnell wieder @Fran, wirklich schätze ich es. Hier ist das Problem jetzt, nicht sicher, warum, aber ich bekomme diesen Fehler, wenn ich versuche, Ihr Bit zu laufen, Fehler: nicht abgeschlossene Klammern, ist es aufgrund der Regex? –

+0

funktioniert auch wie ein Charme @Fran, vielen Dank für die schnelle Antwort! : D –

+0

@UdhayanNair Ich bin mir nicht sicher, ich hatte Probleme, wenn Ihre Eingabe Sonderzeichen hatte, aber diejenigen, die ich entkomme, bevor Sie die Zeichen ersetzen, war es in Ordnung. – Nope

0

$(document).ready(function(){ 
 
var $scope = { array: ["ABC", "ABCDEF", "ABCDEFGHI"] }; 
 
var result = $scope.array.map(function (a, i, b) { 
 
     return a.indexOf(b[i - 1]) ? a : a.slice(b[i - 1].length - a.length); 
 
    }); 
 

 
$('#results').text(result); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="results"></div>

+1

hey da @Idoshhh danke für die Antwort! Das ist ähnlich zu Ninas Code, den sie zuvor oben geschrieben hat. es ist ziemlich ordentlich, aber nicht genau das, was ich will, teilweise aufgrund meines Mangels an Erklärungen. trotzdem danke! –

Verwandte Themen