544 Stimmen

Alle nicht eindeutigen Werte (d.h.: doppeltes/mehrmaliges Vorkommen) in einem Array ermitteln

Ich muss ein JavaScript-Array überprüfen, um festzustellen, ob es irgendwelche doppelten Werte gibt. Was ist der einfachste Weg, dies zu tun? Ich brauche nur zu finden, was die doppelten Werte sind - ich brauche nicht wirklich ihre Indizes oder wie oft sie dupliziert werden.

Ich weiß, dass ich das Array in einer Schleife durchlaufen und alle anderen Werte auf eine Übereinstimmung prüfen kann, aber es scheint, als sollte es einen einfacheren Weg geben.

Ähnliche Frage:

29 Stimmen

Es scheint jahrelang Verwirrung darüber zu herrschen, was diese Frage bedeutet. Ich musste wissen, welche Elemente in dem Array doppelt vorhanden waren: "Ich muss nur herausfinden, welche Werte doppelt vorhanden sind". Die richtige Antwort sollte NICHT die Duplikate aus dem Array entfernen. Das ist genau das Gegenteil von dem, was ich wollte: eine Liste der Duplikate, nicht eine Liste der eindeutigen Elemente.

0 Stimmen

github.com/lodash/lodash/issues/4852#issuecomment-666366511 Ich würde dies als Antwort hinzufügen, aber angesichts der Länge der Antworten würde es nie gesehen werden

372voto

swilliams Punkte 46488

Sie könnten das Array sortieren und dann durchlaufen, um zu sehen, ob der nächste (oder vorherige) Index mit dem aktuellen übereinstimmt. Unter der Annahme, dass Ihr Sortieralgorithmus gut ist, sollte dies weniger als O(n 2 ):

const findDuplicates = (arr) => {
  let sorted_arr = arr.slice().sort(); // You can define the comparing function here. 
  // JS by default uses a crappy string compare.
  // (we use slice to clone the array so the
  // original array won't be modified)
  let results = [];
  for (let i = 0; i < sorted_arr.length - 1; i++) {
    if (sorted_arr[i + 1] == sorted_arr[i]) {
      results.push(sorted_arr[i]);
    }
  }
  return results;
}

let duplicatedArray = [9, 9, 111, 2, 3, 4, 4, 5, 7];
console.log(`The duplicates in ${duplicatedArray} are ${findDuplicates(duplicatedArray)}`);

Im Falle, wenn Sie als Funktion für Duplikate zurückkehren sollen. Dies ist für ähnliche Arten von Fällen.

Referenz: https://stackoverflow.com/a/57532964/8119511

0 Stimmen

Emil, deine Bearbeitung war korrekt, danke. :) Ich sage einfach "Oh zum Quadrat".

12 Stimmen

"Unter der Annahme, dass Ihr Sortieralgorithmus gut ist, sollte dies weniger als O^2 sein. Genauer gesagt, könnte es O(n*log(n)) sein.

0 Stimmen

Und das ist das Beste, was Sie in dem Vergleichsmodell tun können.

215voto

rapfaria Punkte 2537

Wenn Sie die Duplikate beseitigen wollen, probieren Sie diese großartige Lösung aus:

function eliminateDuplicates(arr) {
  var i,
      len = arr.length,
      out = [],
      obj = {};

  for (i = 0; i < len; i++) {
    obj[arr[i]] = 0;
  }
  for (i in obj) {
    out.push(i);
  }
  return out;
}

console.log(eliminateDuplicates([1,6,7,3,6,8,1,3,4,5,1,7,2,6]))

Quelle: http://dreaminginjavascript.wordpress.com/2008/08/22/eliminating-duplicates/

27 Stimmen

Das ist ein guter Code, aber leider tut er nicht das, was ich will.

71 Stimmen

Mit dem obigen Code (der von mir stammt - das ist mein Blog) kommen Sie dem ziemlich nahe. Eine kleine Änderung und Sie sind am Ziel. Zunächst einmal können Sie feststellen, ob arr.length und out.length gleich sind. Wenn sie gleich sind, gibt es keine doppelten Elemente. Aber Sie wollen noch etwas mehr. Wenn Sie die Duplikate "abfangen" wollen, prüfen Sie, ob die Länge des Arrays nach der Zeile obj[arr[i]]=0 zunimmt. Raffiniert, nicht wahr? :-) Danke für die netten Worte, Raphael Montanaro.

0 Stimmen

Außerdem werden Zahlen in Strings umgewandelt, was je nachdem, was Sie tun, akzeptabel sein kann oder nicht. Ein netter Trick, solange man sich über die Tücken im Klaren ist.

207voto

Christian Landgren Punkte 12111

Dies ist meine Antwort aus dem doppelten Thread (!):

Beim Verfassen dieses Eintrags 2014 - waren alle Beispiele for -Schleifen oder jQuery. JavaScript hat die perfekten Werkzeuge dafür: sort , map y reduce .

Doppelte Einträge finden

var names = ['Mike', 'Matt', 'Nancy', 'Adam', 'Jenny', 'Nancy', 'Carl']

const uniq = names
  .map((name) => {
    return {
      count: 1,
      name: name
    };
  })
  .reduce((result, b) => {
    result[b.name] = (result[b.name] || 0) + b.count;

    return result;
  }, {});
const duplicates = Object.keys(uniq).filter((a) => uniq[a] > 1);

console.log(duplicates); // [ 'Nancy' ]

Mehr funktionale Syntax:

@Dmytro-Laptin wies auf einige Codes hin, die entfernt werden können. Dies ist eine kompaktere Version desselben Codes. Mit einigen ES6-Tricks und Funktionen höherer Ordnung:

const names = ['Mike', 'Matt', 'Nancy', 'Adam', 'Jenny', 'Nancy', 'Carl'];
const count = names =>
  names.reduce((result, value) => ({ ...result,
    [value]: (result[value] || 0) + 1
  }), {}); // don't forget to initialize the accumulator
const duplicates = dict =>
  Object.keys(dict).filter((a) => dict[a] > 1);

console.log(count(names)); // { Mike: 1, Matt: 1, Nancy: 2, Adam: 1, Jenny: 1, Carl: 1 }
console.log(duplicates(count(names))); // [ 'Nancy' ]

0 Stimmen

@ChristianLandgren, wo ist die Variable "dict" deklariert? Vielleicht sollte stattdessen "count" verwendet werden?

0 Stimmen

Die Variable dict ist ein Parameter für die Funktion fat-arrow. Sie ist eine Abkürzung für function(dict) { return Object.keys(dict) ... }

0 Stimmen

Beachten Sie, dass dies nicht mit niedrigeren Versionen des IE kompatibel ist, da die => Syntax.

163voto

Laurent Payot Punkte 1188

AKTUALISIERT: Kurz Einzeiler, um die Duplikate zu erhalten:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) !== i) // [2, 4]

Um das Array ohne Duplikate zu erhalten, invertieren Sie einfach die Bedingung:

[1, 2, 2, 4, 3, 4].filter((e, i, a) => a.indexOf(e) === i) // [1, 2, 3, 4]

Ich habe einfach nicht darüber nachgedacht filter() in meiner alten Antwort unten ;)


Wenn Sie nur prüfen müssen, ob es keine Duplikate gibt, wie in diese Frage können Sie die [every()](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/every) Methode:

[1, 2, 3].every((e, i, a) => a.indexOf(e) === i) // true

[1, 2, 1].every((e, i, a) => a.indexOf(e) === i) // false

Beachten Sie, dass every() funktioniert nicht für IE 8 und darunter.

6 Stimmen

Erinnern Sie sich: [2,2,2,2].filter((e, i, a) => a.indexOf(e) !== i) gibt [2, 2, 2]

6 Stimmen

@Wajahath Das ist richtig, danke für den Hinweis. Wenn eindeutige Duplikate erwünscht sind, kann eine Funktion wie f = arr => [...new Set(arr.filter((e, i, a) => a.indexOf(e) !== i))] verwendet werden kann, so dass f([1, 1, 1, 2, 2, 2, 2]) gibt zurück. [1, 2]

0 Stimmen

Die Leistung ist wirklich schlecht, wenn Sie etwa 1 000 000 Einträge haben.

77voto

flu Punkte 13677

Doppelte Werte in einem Array finden

Dies sollte einer der kürzesten Wege sein, um doppelte Werte in einem Array zu finden. Wie vom OP ausdrücklich gewünscht, diese Funktion entfernt keine Duplikate, sondern findet sie .

var input = [1, 2, 3, 1, 3, 1];

var duplicates = input.reduce(function(acc, el, i, arr) {
  if (arr.indexOf(el) !== i && acc.indexOf(el) < 0) acc.push(el); return acc;
}, []);

document.write(duplicates); // = 1,3 (actual array == [1, 3])

Dies erfordert keine Sortierung oder ein Framework von Drittanbietern. Es braucht auch keine manuellen Schleifen. Es funktioniert mit jedem Wert indexOf() (oder um es deutlicher zu sagen: die strenger Vergleichsoperator ) unterstützt.

Wegen der reduzieren() y indexOf() Es wird mindestens IE 9 benötigt.

11 Stimmen

ES6 Pfeil/einfache/reine Version: const dupes = items.reduce((acc, v, i, arr) => arr.indexOf(v) !== i && acc.indexOf(v) === -1 ? acc.concat(v) : acc, [])

0 Stimmen

if (arr.indexOf(el) !== i && !acc.includes(el) ) acc.push(el); return acc; funktioniert auch

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