3 Stimmen

Anhängen der Zählung an Duplikate in einem Javascript-String-Array

Ich versuche, die Anzahl an doppelte Einträge in einem String-Array anzuhängen. Ich habe ein Array wie dieses, das doppelte Einträge enthält.

var myarray = ["John", "John", "John", "Doe", "Doe", "Smith", 
               "John", "Doe", "Joe"];

Meine gewünschte Ausgabe ist

var newArray = ["John - 1", "John - 2", "John - 3", "Doe - 1", 
                "Doe - 2", "Smith", "John - 4", "Doe - 3", "Joe"];

Wie lässt sich dies am besten bewerkstelligen?

8voto

Alnitak Punkte 324207

Dies funktioniert mit zwei Durchgängen von Array.map() :

var map = {};
var count = myarray.map(function(val) {
    return map[val] = (typeof map[val] === "undefined") ? 1 : map[val] + 1;
});

var newArray = myarray.map(function(val, index) {
    if (map[val] === 1) {
        return val;
    } else {
        return val + ' - ' + count[index];
    }
});

Der erste Durchlauf zeichnet die Anzahl der Male auf, die jedes einzelne Element gesehen wurde, und gibt ein Array zurück, das dem Eingabe-Array entspricht, das die aktuelle Anzahl für jedes Element aufzeichnet.

Im zweiten Durchgang wird die Zahl an alle Elemente angehängt, deren Gesamtzahl nicht eins war.

Arbeitsdemo unter http://jsfiddle.net/alnitak/Z4dgr/

4voto

hvgotcodes Punkte 114342

Etwas wie

var counts = {}, newArray = [];

// first pass, assign the counts
for (var i = 0; i < myArray.length; i++) {
   var name = myArray[i],
       count = counts.name;

   if (!count) {
      count = 1;
   } else {
      count++;
   }

   counts[name] = count;

   name = name + " - " + count;
   newArray.push(name);
}

// Undo changes made for names that only occur once
for (var i = 0; i < myArray.length; i++) {
   var name = myArray[i],
       count = counts.name;

   if (count === 1) {
      newArray[i] = name;
   }

}

Hinweis: Ich verwende sehr einfaches Javascript, um die Lösung leicht lesbar und verständlich zu halten. Beachten Sie, dass Sie das Array zweimal übergeben müssen. Für sehr große Listen, ist dies nicht sehr effizient.

Ich habe das nicht getestet, aber so etwas sollte funktionieren.

0voto

Minko Gechev Punkte 24430

Dies sollte Ihnen die Anzahl aller Duplikate anzeigen:

var myarray = ["John", "John", "John", "Doe", "Doe", "Smith", 
           "John", "Doe", "Joe"];
var values = {}, newArray = [];
for (var i = 0; i < myarray.length; i++) {
    if (typeof values[myarray[i]] === 'undefined') {
        values[myarray[i]] = 1;
    } else {
        values[myarray[i]] += 1;
    }
}
for (var i = 0; i < myarray.length; i++) {
    if (values[myarray[i]] > 1) {
        newArray.push(myarray[i] + ' - ' + values[myarray[i]]);
    } else {
        newArray.push(myarray[i]);
    }
}

Mit freundlichen Grüßen!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X