So erhalten Sie eindeutige Werte in einem Array

167

Wie kann ich eine Liste eindeutiger Werte in einem Array abrufen? Muss ich immer ein zweites Array verwenden oder gibt es etwas Ähnliches wie die Java-Hashmap in JavaScript?

Ich werde verwenden JavaScript und jQuery verwenden . Es können keine zusätzlichen Bibliotheken verwendet werden.

Astronaut
quelle
2
stackoverflow.com/questions/5381621/… - beschreibt genau, was Sie wollen, denke ich?
SpaceBison
1
Sind Sie offen für die Nutzung der underscore.jsBibliothek?
Jakee
Eine Java-Hashmap ist im Grunde dasselbe wie ein Javascript-Objekt. Syntax ist {"key": "value", "key2": "value2"}
Ian
JavaScript / TypeScript-Sammlung APIs sind schrecklich im Vergleich zu Scala,list.toSet
Jordan Stewart

Antworten:

120

Da ich in den Kommentaren zu @ Rockets Antwort darauf eingegangen bin, kann ich auch ein Beispiel angeben, das keine Bibliotheken verwendet. Dies erfordert zwei neue Prototypfunktionen containsundunique

Array.prototype.contains = function(v) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] === v) return true;
  }
  return false;
};

Array.prototype.unique = function() {
  var arr = [];
  for (var i = 0; i < this.length; i++) {
    if (!arr.contains(this[i])) {
      arr.push(this[i]);
    }
  }
  return arr;
}

var duplicates = [1, 3, 4, 2, 1, 2, 3, 8];
var uniques = duplicates.unique(); // result = [1,3,4,2,8]

console.log(uniques);

Für mehr Zuverlässigkeit können Sie containsdas indexOfShim von MDN ersetzen und prüfen, ob jedes Element indexOfgleich -1: Dokumentation ist

Jackwanders
quelle
1
~a.indexOf(b) === (a.indexOf(b) == -1)
Orwellophile
1
@ Lexynux: Das war die Art von geeky Javascript-Nerd-Antwort, die nur von jemandem verwendet werden sollte, der versteht, was es bedeutet, und möglicherweise auch dann nicht. Was es sagt, ist, dass das Schreiben mit dem Schreiben umso länger identischif (~a.indexOf(b)) ... ist . if (a.indexOf(b) == -1) ...
Orwellophile
4
Dies hat eine hohe Laufzeitkomplexität (schlimmster Fall: O (n ^ 2))
Rahul Arora
1
Dies ist eine wirklich ineffiziente Implementierung. Es ist schrecklich, das Ergebnisarray zu überprüfen, um festzustellen, ob es bereits ein Element enthält. Ein besserer Ansatz wäre, entweder ein Objekt zu verwenden, das die Anzahl verfolgt, oder wenn Sie keinen Aux-Speicher verwenden möchten, sortieren Sie es zuerst in O (n log n), dann in einen linearen Sweep und vergleichen Sie Elemente nebeneinander
Isaiah Lee
1
Brauchen wir wirklich die "enthält" -Funktion?
Animesh Kumar
206

Oder für diejenigen, die einen Einzeiler (einfach und funktional) suchen, der mit aktuellen Browsern kompatibel ist :

let a = ["1", "1", "2", "3", "3", "1"];
let unique = a.filter((item, i, ar) => ar.indexOf(item) === i);
console.log(unique);

Update 18-04-2017

Es sieht so aus, als ob 'Array.prototype.includes' jetzt in den neuesten Versionen der Hauptbrowser weit verbreitet ist ( Kompatibilität) ).

Update 29-07-2015:

Es ist geplant, dass Browser eine standardisierte Methode 'Array.prototype.includes' unterstützen, die diese Frage zwar nicht direkt beantwortet. ist oft verwandt.

Verwendung:

["1", "1", "2", "3", "3", "1"].includes("2");     // true

Pollyfill ( Browserunterstützung , Quelle von Mozilla ):

// https://tc39.github.io/ecma262/#sec-array.prototype.includes
if (!Array.prototype.includes) {
  Object.defineProperty(Array.prototype, 'includes', {
    value: function(searchElement, fromIndex) {

      // 1. Let O be ? ToObject(this value).
      if (this == null) {
        throw new TypeError('"this" is null or not defined');
      }

      var o = Object(this);

      // 2. Let len be ? ToLength(? Get(O, "length")).
      var len = o.length >>> 0;

      // 3. If len is 0, return false.
      if (len === 0) {
        return false;
      }

      // 4. Let n be ? ToInteger(fromIndex).
      //    (If fromIndex is undefined, this step produces the value 0.)
      var n = fromIndex | 0;

      // 5. If n ≥ 0, then
      //  a. Let k be n.
      // 6. Else n < 0,
      //  a. Let k be len + n.
      //  b. If k < 0, let k be 0.
      var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);

      // 7. Repeat, while k < len
      while (k < len) {
        // a. Let elementK be the result of ? Get(O, ! ToString(k)).
        // b. If SameValueZero(searchElement, elementK) is true, return true.
        // c. Increase k by 1.
        // NOTE: === provides the correct "SameValueZero" comparison needed here.
        if (o[k] === searchElement) {
          return true;
        }
        k++;
      }

      // 8. Return false
      return false;
    }
  });
}
Josh Mc
quelle
Es ist fast Copy Paste aus Kennebec, aber das Übergeben des Arrays als Parameter, anstatt den Abschluss zu verwenden, wird wahrscheinlich die Leistung verbessern.
- muss sagen, dass ich die Punkte nicht verbunden habe, einfach nach einem Einzeiler gescannt habe, wie ein großer übersprungener Post aussah, eine alternative Quelle gefunden und neu gepostet habe, damit andere sie schnell finden können. Das heißt, dein Recht; so ziemlich das gleiche wie kennebec.
Josh Mc
Nizza - Der im Array als Parameter gesendete Filter wurde nicht erkannt und wollte nicht an einem externen Objekt arbeiten. Dies ist genau das, was ich brauche - meine Version von Javascript (ältere Xerces-Version) wird für eine Weile nicht die neuen Extras haben.
Gerard ONeill
1
@GerardONeill Ja, in einigen Situationen ist es sehr wichtig, z. B. wenn es funktional verkettet ist und Sie Zugriff auf ein Array wünschen, dem keine Variable wie .map (...) zugewiesen wurde. Filter (...)
Josh Mc
@ Josh Mc, könnten Sie irgendwie "Includes" in "Unique" -Methode verwenden?
Vkelman
142

Hier ist eine viel sauberere Lösung für ES6, die hier nicht enthalten ist. Es verwendet den Operator Set und den Spread-Operator :...

var a = [1, 1, 2];

[... new Set(a)]

Welches kehrt zurück [1, 2]

Charles Clayton
quelle
1
Das ist so klug!
Josh Mc
1
Nun DIES ist ein Einzeiler!
Mac
11
In Typescript müssen Sie verwenden, Array.from(... new Set(a))da Set nicht implizit in einen Array-Typ konvertiert werden kann. Nur ein Kopf hoch!
Zachscs
4
@Zachscs, ich habe einen Kompilierungsfehler bekommen, als ich das versucht habe. Meinten Sie gerade Array.from(new Set(a))? Das scheint zu funktionieren.
Adam0101
71

Ein Liner, reines JavaScript

Mit ES6-Syntax

list = list.filter((x, i, a) => a.indexOf(x) === i)

x --> item in array
i --> index of item
a --> array reference, (in this case "list")

Geben Sie hier die Bildbeschreibung ein

Mit ES5-Syntax

list = list.filter(function (x, i, a) { 
    return a.indexOf(x) === i; 
});

Browserkompatibilität : IE9 +

Vamsi
quelle
4
Ich bin mir nicht sicher, warum dies abgelehnt wurde. Es mag zunächst wenig dunkel sein und vielleicht als „klug“ und nicht pragmatisch zu lesen eingestuft werden, aber es ist deklarativ, zerstörungsfrei und prägnant, wo die meisten anderen Antworten fehlen.
Larry
1
@ Larry dies wurde abgelehnt, weil genau die gleiche Antwort Jahre vor dieser gegeben wurde.
Alex Okrushko
@AlexOkrushko fair genug - verpasste diese Antwort wegen der Art und Weise, wie sie formatiert wurde
Larry
6
Alles ist ein Einzeiler, wenn Sie alles in eine Zeile setzen :-)
Gary McGill
Es könnte schön sein, die Gleichheitsnotiz a.indexOf(x) === ider drei Gleichheitszeichen zu verschärfen .
Baumjäger
20

Mit EcmaScript 2016 können Sie es einfach so machen.

 var arr = ["a", "a", "b"];
 var uniqueArray = Array.from(new Set(arr)); // Unique Array ['a', 'b'];

Sets sind immer eindeutig und werden verwendet Array.from() Sie ein Set in ein Array konvertieren. Schauen Sie sich als Referenz die Dokumentationen an.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects /Einstellen

Adeel Imran
quelle
1
Das ist die Antwort, die Sie verwenden sollten. indexOf()Antworten sind schrecklich, weil sie O (N ^ 2) sind. Die verteilten Antworten sind in Ordnung, funktionieren jedoch nicht für große Arrays. Dies ist der beste Ansatz.
Timmmm
20

Jetzt können wir in ES6 die neu eingeführte ES6-Funktion verwenden

let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2]
let uniqueItems = Array.from(new Set(items))

ODER durch Array-Spread-Syntax für Iterables

let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2]; 
let uniqueItems = [...new Set(items)];

Es wird das eindeutige Ergebnis zurückgegeben.

[1, 3, 4, 5, 2, 23]
Rohit.007
quelle
1
Sauberste Lösung!
Dimitris Filippou
Dies ist der richtige Weg, wenn Sie sich in einer JS-Umgebung befinden, die new Setdies unterstützt (z. B. modernes Angular / TypeScript)
Don Cheadle,
1
Es ist erwähnenswert, dass Sie die Array-Spread-Syntax auch für Iterables wie Set und Map verwenden können: let items = [1,1,1,1,3,4,5,2,23,1,4,4,4,2,2,2]; let uniqueItems = [...new Set(items)];
Jacobedawson
Ich liebe diese ES6-Antworten!
Glen Thompson
1
Dies ist identisch mit der Antwort von @Adeel Imran. Bitte machen Sie keine Antworten, die genau den vorhandenen Antworten entsprechen.
Timmmm
16

Wenn Sie das ursprüngliche Array intakt lassen möchten,

Sie benötigen ein zweites Array, um die einzigartigen Elemente des ersten zu enthalten.

Die meisten Browser haben Array.prototype.filter:

var unique= array1.filter(function(itm, i){
    return array1.indexOf(itm)== i; 
    // returns true for only the first instance of itm
});


//if you need a 'shim':
Array.prototype.filter= Array.prototype.filter || function(fun, scope){
    var T= this, A= [], i= 0, itm, L= T.length;
    if(typeof fun== 'function'){
        while(i<L){
            if(i in T){
                itm= T[i];
                if(fun.call(scope, itm, i, T)) A[A.length]= itm;
            }
            ++i;
        }
    }
    return A;
}
 Array.prototype.indexOf= Array.prototype.indexOf || function(what, i){
        if(!i || typeof i!= 'number') i= 0;
        var L= this.length;
        while(i<L){
            if(this[i]=== what) return i;
            ++i;
        }
        return -1;
    }
kennebec
quelle
14

Heutzutage können Sie den Datentyp Set von ES6 verwenden, um Ihr Array in ein eindeutiges Set zu konvertieren. Wenn Sie dann Array-Methoden verwenden müssen, können Sie diese wieder in ein Array umwandeln:

var arr = ["a", "a", "b"];
var uniqueSet = new Set(arr); // {"a", "b"}
var uniqueArr = Array.from(uniqueSet); // ["a", "b"]
//Then continue to use array methods:
uniqueArr.join(", "); // "a, b"
Fawntasia
quelle
1
Ordentlich, wäre schön, einige Leistungszahlen zu sehen, ich denke, das Konvertieren dieser Sets, insbesondere wenn sie sehr dynamisch und groß sind, könnte ein Leistungsproblem sein. Die einzige Möglichkeit, dies zu erkennen, ist das Testen :)
Astronaut
2
Wenn Sie einen Transpiler verwenden oder sich in einer Umgebung befinden, die ihn unterstützt, können Sie das Gleiche präziser tun als:var uniqueArr = [...new Set(arr)]; // ["a", "b"]
Stenerson
Hey @Astronaut haben einige Tests über die Leistung gemacht, wie Sie sagten?
Alexventuraio
8

Nicht in Javascript nativ, aber viele Bibliotheken haben diese Methode.

Underscore.js _.uniq(array)( Link ) funktioniert ganz gut ( Quelle ).

Calvin
quelle
Danke fürs teilen! Diese Funktion verwendet Iterator und Kontext zusammen mit dem Array als Argumentliste aus Version 1.4.3.
Kunj
6

Mit jQuery habe ich folgende Array-Funktion erstellt:

Array.prototype.unique = function () {
    var arr = this;
    return $.grep(arr, function (v, i) {
        return $.inArray(v, arr) === i;
    });
}

console.log([1,2,3,1,2,3].unique()); // [1,2,3]
Rakete Hazmat
quelle
5
Wenn Sie jQuery im Prototyp eines Javascript-Kernobjekts verwenden möchten, ist es möglicherweise nicht besser, eine jQuery-Funktion zu schreiben, z $.uniqueArray(arr). Das Einbetten von Verweisen auf jQuery in Arrayden Prototyp erscheint fraglich
Jackwanders
1
@jackwanders: Was ist daran so fragwürdig? Wenn Sie jQuery auf der Seite haben, verwenden wir es.
Rocket Hazmat
Nur dass die neue eindeutige Funktion, die Sie geschrieben haben, jetzt von jQuery abhängt. Sie können es nicht auf eine neue Site oder App verschieben, ohne sicherzustellen, dass dort jQuery verwendet wird.
Jackwanders
2
das war mein Punkt; Wenn Sie jQuery verwenden möchten, machen Sie die Funktion selbst zu einem Teil von jQuery. Wenn ich den Prototyp eines Kernobjekts erweitern würde, würde ich mich an das Kern-Javascript halten, nur um die Dinge wiederverwendbar zu halten. Wenn jemand anderes Ihren Code betrachtet, ist es offensichtlich, dass er $.uniqueArrayvon jQuery abhängt. weniger offensichtlich Array.prototype.uniqueist das auch.
Jackwanders
1
@ Jackwanders: Ich denke. Ich verwende dies in meinem Code, da ich immer jQuery verwende, und ich mag es einfach, prototypes zu erweitern. Aber ich verstehe jetzt Ihren Standpunkt. Ich werde das trotzdem hier lassen.
Rocket Hazmat
6

Kurze und süße Lösung mit zweitem Array;

var axes2=[1,4,5,2,3,1,2,3,4,5,1,3,4];

    var distinct_axes2=[];

    for(var i=0;i<axes2.length;i++)
        {
        var str=axes2[i];
        if(distinct_axes2.indexOf(str)==-1)
            {
            distinct_axes2.push(str);
            }
        }
    console.log("distinct_axes2 : "+distinct_axes2); // distinct_axes2 : 1,4,5,2,3
Pradip Shenolkar
quelle
Kurz? und süß? Haben Sie sich die Top-Lösungen angesehen?
Alex Okrushko
5

Schnell, kompakt, keine verschachtelten Schleifen, funktioniert mit jedem Objekt, nicht nur mit Zeichenfolgen und Zahlen, benötigt ein Prädikat und nur 5 Codezeilen !!

function findUnique(arr, predicate) {
  var found = {};
  arr.forEach(d => {
    found[predicate(d)] = d;
  });
  return Object.keys(found).map(key => found[key]); 
}

Beispiel: So finden Sie eindeutige Elemente nach Typ:

var things = [
  { name: 'charm', type: 'quark'},
  { name: 'strange', type: 'quark'},
  { name: 'proton', type: 'boson'},
];

var result = findUnique(things, d => d.type);
//  [
//    { name: 'charm', type: 'quark'},
//    { name: 'proton', type: 'boson'}
//  ] 

Wenn Sie möchten, dass das erste eindeutige Element anstelle des letzten gefunden wird, fügen Sie dort ein found.hasOwnPropery () hinzu.

user1618323
quelle
4

Sie benötigen nur Vanilla JS, um Unikate mit Array.some und Array.reduce zu finden. Mit der ES2015-Syntax sind es nur 62 Zeichen.

a.reduce((c, v) => b.some(w => w === v) ? c : c.concat(v)), b)

Array.some und Array.reduce werden in IE9 + und anderen Browsern unterstützt. Ändern Sie einfach die Fettpfeilfunktionen für reguläre Funktionen, um sie in Browsern zu unterstützen, die die ES2015-Syntax nicht unterstützen.

var a = [1,2,3];
var b = [4,5,6];
// .reduce can return a subset or superset
var uniques = a.reduce(function(c, v){
    // .some stops on the first time the function returns true                
    return (b.some(function(w){ return w === v; }) ?  
      // if there's a match, return the array "c"
      c :     
      // if there's no match, then add to the end and return the entire array                                        
      c.concat(v)}),                                  
  // the second param in .reduce is the starting variable. This is will be "c" the first time it runs.
  b);                                                 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects / Array / Reduzieren

Welpenbits
quelle
4

Die meisten der oben genannten Lösungen weisen eine hohe Laufzeitkomplexität auf.

Hier ist die Lösung, reducedie die Arbeit verwendet und erledigen kann O (n) Zeit .

Array.prototype.unique = Array.prototype.unique || function() {
        var arr = [];
	this.reduce(function (hash, num) {
		if(typeof hash[num] === 'undefined') {
			hash[num] = 1; 
			arr.push(num);
		}
		return hash;
	}, {});
	return arr;
}
    
var myArr = [3,1,2,3,3,3];
console.log(myArr.unique()); //[3,1,2];

Hinweis:

Diese Lösung ist nicht abhängig von reduzieren. Die Idee ist, eine Objektzuordnung zu erstellen und eindeutige Objekte in das Array zu verschieben.

Rahul Arora
quelle
1

ES6 Weg:

const uniq = (arr) => (arr.filter((item, index, arry) => (arry.indexOf(item) === index)));
Ashwin Aggarwal
quelle
1

Sie können verwenden,

let arr1 = [1,2,1,3];
let arr2 = [2,3,4,5,1,2,3];

let arr3 = [...new Set([...arr1,...arr2])];

es wird Ihnen einzigartige Elemente geben,

**> aber es gibt einen Haken,

für diese "1" und 1 und sind diff Elemente, **

Die zweite Option ist die Verwendung der Filtermethode für das Array.

Niranjan Harpale
quelle
1

Sie können ein Array mit Duplikaten eingeben. Die folgende Methode gibt ein Array mit eindeutigen Elementen zurück.

function getUniqueArray(array){
    var uniqueArray = [];
    if (array.length > 0) {
       uniqueArray[0] = array[0];
    }
    for(var i = 0; i < array.length; i++){
        var isExist = false;
        for(var j = 0; j < uniqueArray.length; j++){
            if(array[i] == uniqueArray[j]){
                isExist = true;
                break;
            }
            else{
                isExist = false;
            }
        }
        if(isExist == false){
            uniqueArray[uniqueArray.length] = array[i];
        }
    }
    return uniqueArray;
}
Muhammad Haroon Iqbal
quelle
0

Das einzige Problem mit den bisher gegebenen Lösungen ist die Effizienz. Wenn Sie sich darüber Sorgen machen (und dies wahrscheinlich auch tun sollten), müssen Sie verschachtelte Schleifen vermeiden: Für * for, filter * indexOf, grep * inArray durchlaufen alle das Array mehrmals. Sie können eine einzelne Schleife mit Lösungen wie dieser oder dieser implementieren

Jesús Carrera
quelle
0
Array.prototype.unique = function () {
    var dictionary = {};
    var uniqueValues = [];
    for (var i = 0; i < this.length; i++) {
        if (dictionary[this[i]] == undefined){
            dictionary[this[i]] = i;
            uniqueValues.push(this[i]);
        }
    }
    return uniqueValues; 
}
Hexer338
quelle
0

Ich habe dieses Problem in reinem JS ausprobiert. Ich habe die folgenden Schritte ausgeführt: 1. Sortieren Sie das angegebene Array, 2. Durchlaufen Sie das sortierte Array, 3. Überprüfen Sie den vorherigen und den nächsten Wert mit dem aktuellen Wert

// JS
var inpArr = [1, 5, 5, 4, 3, 3, 2, 2, 2,2, 100, 100, -1];

//sort the given array
inpArr.sort(function(a, b){
    return a-b;
});

var finalArr = [];
//loop through the inpArr
for(var i=0; i<inpArr.length; i++){
    //check previous and next value 
  if(inpArr[i-1]!=inpArr[i] && inpArr[i] != inpArr[i+1]){
        finalArr.push(inpArr[i]);
  }
}
console.log(finalArr);

Demo

Sanketh Nayak
quelle
0
function findUniques(arr){
  let uniques = []
  arr.forEach(n => {
    if(!uniques.includes(n)){
      uniques.push(n)
    }       
  })
  return uniques
}

let arr = ["3", "3", "4", "4", "4", "5", "7", "9", "b", "d", "e", "f", "h", "q", "r", "t", "t"]

findUniques(arr)
// ["3", "4", "5", "7", "9", "b", "d", "e", "f", "h", "q", "r", "t"]
smithWEBtek
quelle
0

Wenn Sie bedenken, dass indexOfdas erste Auftreten eines Elements zurückgegeben wird, können Sie Folgendes tun:

Array.prototype.unique = function(){
        var self = this;
        return this.filter(function(elem, index){
            return self.indexOf(elem) === index;
        })
    }
Nikksan
quelle
0

Wenn Sie sich nicht so viele Gedanken über ältere Browser machen müssen, ist dies genau das, wofür Sets entwickelt wurden.

Mit dem Set-Objekt können Sie eindeutige Werte eines beliebigen Typs speichern, unabhängig davon, ob es sich um primitive Werte oder Objektreferenzen handelt.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

const set1 = new Set([1, 2, 3, 4, 5, 1]);
// returns Set(5) {1, 2, 3, 4, 5}
Paul Cooper
quelle
0

Ein anderer Gedanke an diese Frage. Folgendes habe ich getan, um dies mit weniger Code zu erreichen.

var distinctMap = {};
var testArray = ['John', 'John', 'Jason', 'Jason'];
for (var i = 0; i < testArray.length; i++) {
  var value = testArray[i];
  distinctMap[value] = '';
};
var unique_values = Object.keys(distinctMap);

console.log(unique_values);

Xing-Wei Lin
quelle
0

function findUnique(arr) {
  var result = [];
  arr.forEach(function(d) {
    if (result.indexOf(d) === -1)
      result.push(d);
  });
  return result;
}

var unique = findUnique([1, 2, 3, 1, 2, 1, 4]); // [1,2,3,4]
console.log(unique);

user1739150
quelle
0

Hier ist ein Ansatz mit anpassbarer equalsFunktion, der sowohl für Grundelemente als auch für benutzerdefinierte Objekte verwendet werden kann:

Array.prototype.pushUnique = function(element, equalsPredicate = (l, r) => l == r) {
    let res = !this.find(item => equalsPredicate(item, element))
    if(res){
        this.push(element)
    }
    return res
}

Verwendung:

//with custom equals for objects
myArrayWithObjects.pushUnique(myObject, (left, right) => left.id == right.id)

//with default equals for primitives
myArrayWithPrimitives.pushUnique(somePrimitive)
Virus
quelle
0

Meine Antwort verwendet Array.filterund Array.indexOfMethoden, um die eindeutigen Werte zu erhalten

array.filter((value, index, self)=>self.indexOf(value)===index)

Ich habe diesen Ansatz auf einer Website gesehen, aber ihr Code ist anders als hier. Ich habe den Code auf eine Zeile vereinfacht und hier veröffentlicht, damit jemand davon profitiert

Hinweis: Mein Ansatz ähnelt dem von Josh. Ich lasse es hier, da die Variablennamen in meinem Code selbsterklärend sind.

Anand Raj
quelle
-1

Ich dachte nur, ob wir die lineare Suche verwenden können, um die Duplikate zu beseitigen:

JavaScript:
function getUniqueRadios() {

var x=document.getElementById("QnA");
var ansArray = new Array();
var prev;


for (var i=0;i<x.length;i++)
  {
    // Check for unique radio button group
    if (x.elements[i].type == "radio")
    {
            // For the first element prev will be null, hence push it into array and set the prev var.
            if (prev == null)
            {
                prev = x.elements[i].name;
                ansArray.push(x.elements[i].name);
            } else {
                   // We will only push the next radio element if its not identical to previous.
                   if (prev != x.elements[i].name)
                   {
                       prev = x.elements[i].name;
                       ansArray.push(x.elements[i].name);
                   }
            }
    }

  }

   alert(ansArray);

}}

HTML:

<body>

<form name="QnA" action="" method='post' ">

<input type="radio"  name="g1" value="ANSTYPE1"> good </input>
<input type="radio" name="g1" value="ANSTYPE2"> avg </input>

<input type="radio"  name="g2" value="ANSTYPE3"> Type1 </input>
<input type="radio" name="g2" value="ANSTYPE2"> Type2 </input>


<input type="submit" value='SUBMIT' onClick="javascript:getUniqueRadios()"></input>


</form>
</body>
Suresh
quelle
-1

Hier ist die Einzeiler-Lösung für das Problem:

var seriesValues = [120, 120, 120, 120];
seriesValues = seriesValues.filter((value, index, seriesValues) => (seriesValues.slice(0, index)).indexOf(value) === -1);
console.log(seriesValues);

Kopieren, in die Browserkonsole einfügen und die Ergebnisse erhalten, yo :-)

Manish Kumar
quelle
-2

Ich habe JQuery Unique Funktion eingebaut .

uniqueValues= jQuery.unique( duplicateValues );

Weitere Informationen finden Sie in den jquery API-Dokumentationen.

http://api.jquery.com/jquery.unique/

Mitul Maheshwari
quelle
8
Beachten Sie, dass dies nur für Arrays von DOM-Elementen funktioniert, nicht für Zeichenfolgen oder Zahlen. - Zitat aus der Dokumentation.
mco