2016-09-23 3 views
0

Unten ist mein Array ....Wie entfernt man alle Elemente nach einem bestimmten Array-Element?

["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"] 

Was kann ich tun, um eine Reihe zu kommen wie [ "AAA", "BBB", "CCC"]

zum Beispiel, wenn die ersten Element ist "AAA", ich möchte alle Elemente nach der zweiten "AAA" löschen (zweite "AAA" auch entfernen)

Danke.

+2

Sie versuchen, einzigartige Elemente aus einem Array zu filtern? –

+2

'arr.slice (0, indexOfSpecificElement + 1)' 'oder' array.length = indexOfSpecificElement + 1; '. –

+0

@DhananjayaKuppu Was ich will, ist nur das erste Muster eines Arrays zu bekommen. wie "AAA", "BBB", "CCC" – Dreams

Antwort

2

Sie können dies einfach mit indexOf und Slice Methoden von Array in Javascript.

var arr = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"]; 
var firstElem = arr[0]; 
var secondIndex = arr.indexOf(firstElem, 1); 

// Output: ["AAA", "BBB", "CCC"] 
var newArr = (secondIndex != -1) ? arr.slice(0, secondIndex) : arr; 

Arbeits Fiddle: https://jsfiddle.net/4f25wyaj/2/

+5

Das ist gut, aber beachte, dass wenn das erste Element * nicht * wiederholt wird, das Ergebnis ein Array sein wird, das alle ursprünglichen Elemente außer dem letzten enthält. – nnnnnn

+0

@ nnnnnn-aber das ist, was das OP will. – RobG

+2

@RobG - Das OP sagt nicht, was zu tun ist, wenn das erste Element nicht wiederholt wird, aber es erscheint unwahrscheinlich, dass das Entfernen des letzten Elements über '.slice (0, -1)' das Richtige ist Fall. – nnnnnn

-1

Obwohl Ihre Frage nicht ganz klar ist aber nach wie vor, wie pro mein Verständnis Ich reiche folgende Lösungen

Solution 1: 
Assumption: You have a list of input and a pointer which shows the last index till you want to pick the input data. 

    public static void main(String[] args) { 
     String input[] = { "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD" }; 
     String output[]= new String[5]; 
     int stopByIndex =3; 

     for(int i=0;i<stopByIndex;i++){ 
      output[i]=input[i]; 
     } 
     System.out.println(output); 
    } 


Solution 2: 
Assumption: Print elements which occurred multiple times: 

    public static void main(String[] args) { 
    String input[] = { "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD" }; 
    List<String> output = new ArrayList<>(); 
    Map<String, Integer> keyWithCount = new HashMap<String, Integer>(); 
    int stopByIndex = 3; 

    for (String str : input) { 
     if (keyWithCount.containsKey(str)) { 
      keyWithCount.put(str, keyWithCount.get(str) + 1); 
     } else { 
      keyWithCount.put(str, 1); 
     } 
    } 

    Iterator<Entry<String, Integer>> itr = keyWithCount.entrySet().iterator(); 
    while (itr.hasNext()) { 
     Entry<String, Integer> entry = itr.next(); 

     if (entry.getValue() > 1) { 
      output.add(entry.getKey()); 
     } 
    } 

    System.out.println(output); 
} 
+1

Die Frage wurde mit "javascript" getaggt ... – nnnnnn

0

Sie Array.prototype.filter() verwenden können, das Bezugs erste Element Array, um zu überprüfen, ob der Wert iteriert wurde

var arr = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"] 
 

 
var again = false; 
 

 
arr = arr.filter(function(el, index) { 
 
    return !again && (again = index > 0 && el === arr[0], !again); 
 
}); 
 

 
console.log(arr);

+0

Warum nicht 'var newArr = arr.slice (arr.IndexOf (arr [0], 1))'. – RobG

+0

@RobG _ "Warum nicht' var newArr = arr.slice (arr.IndexOf (arr [0], 1)) '" _ Scheint zurückzukehren '[" AAA "," BBB "," CCC "," AAA " , "BBB", "CCC", "DDD"] '? – guest271314

+0

Können Sie erklären, wofür der 'valueOf' gut ist? – Bergi

0

Schnellere Implementierung (besser für kurze oder mittlere Größe Arrays):

var a = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"]; 

// Faster implementation: 
// (Better for short or medium size arrays) 
var b = a.filter((function(){ 
    var idx = {}; 
    var cont = true; // Continue 
    return function (item){ 
     if (! cont) return false; 
     if (idx[item]) return cont = false; 
     return idx[item] = true; 
    }; 
})()); 

console.log(b); 
// [ 'AAA', 'BBB', 'CCC' ] 

Implementierung mit minimalem Speicher Abfälle (aber sehr uneffizient):

// Minimal memory waste implementation: 
var b = a.filter((function(){ 
    var cont = true; // Continue 
    return function (item, i){ 
     if (! cont) return false; 
     if (a.slice(0, i).filter(x=>x==item).length) return cont = false; 
     return true; 
    }; 
})()); 

console.log(b); 
// [ 'AAA', 'BBB', 'CCC' ] 

Natürlich gibt ist unendliche Zwischenlösungen (abhängig von Ihren Bedürfnissen). Aber, wenn Sie HUGE Arrays nicht analysieren müssen, ist die beste Lösung, den ersten Ansatz zu verwenden: Index wird von Garbage Collector freigegeben, sobald der Filterprozess abgeschlossen ist und in der Tat, wenn Sie Glück haben und Wiederholung passieren

var arr = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC",  "DDD"]; 

arr.splice(3) 
+0

Anstelle von 'filter (...) .length' willst du' some (...) 'verwenden. Oder benutze einfach 'indexOf', es nimmt sogar eine Startposition ein. – Bergi

+0

Für große Arrays wäre eine noch bessere Lösung, überhaupt keinen Filter zu verwenden, weil Sie wahrscheinlich nicht das gesamte Array durchlaufen müssen. Hör einfach auf, wenn du die Scheibe hast, die du brauchst. – Bergi

+0

Vielleicht ja oder vielleicht nicht: '.some()' wurde in ECMA-262 standardisiert (Anfang Juni 2016). Je nachdem, wo Sie es ausführen möchten, benötigen Sie einen Polyfill. Selbst, natürlich, einige() stoppen beim ersten Spiel und vermeiden ein bisschen extra Prozess am Ende. – bitifet

-1

Versuchen Sie, diese verwendet werden.

each() geht durch das Array und fügt dem neuen Array Elemente hinzu, bis ein Duplikat des ersten Elements gefunden wird.

var arr = ["AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "AAA", "BBB", "CCC", "DDD"]; 
var newArray = []; 
$.each(arr, function(i, el){ 
    if($.inArray(el, newArray) === -1) 
     newArray.push(el); 
    else if (el == arr[0]) 
     return false 
}); 
arr = newArray; 
// Formatted array is in "arr" 
alert(arr); 
+1

Wie hast du gedacht, dass die erste Wiederholung immer an der vierten Position sein wird? : LOL: – bitifet

+0

Warum nicht einfach versuchen 'var arr = [" AAA "," BBB "," CCC "];'? Das bringt uns das Ergebnis ohne inperformantes Spleißen. – Bergi

0

quick and dirty mit jQuery each() Funktion: früh, dann wird kein viel Speicher ;-)

+0

Kaum schnell. Warum in aller Welt würdest du jQuery * each * verwenden, wenn das eingebaute * forEach * verfügbar ist? Wenn Sie IE8-Unterstützung möchten, müssen Sie zurück zu jQuery 1.12 gehen. Besser, ein [* Polyfill *] zu verwenden (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach). – RobG

+0

Sie haben 68k Ruf, Sie sollten besser wissen, dass es nicht um Optimierung geht, es geht darum, das Problem zu lösen. Dies ist nicht "die beste Lösung". Dies ist eine Lösung. –

Verwandte Themen