# Jak Odstranit Řadu Duplicit v ES6

Tady jsou 3 způsoby, jak odfiltrovat duplicity z pole, a vrátit pouze jedinečné hodnoty. Můj oblíbený je použití Set protože je to nejkratší a nejjednodušší 😁

const array = ;// 1: "Set";// 2: "Filter"array.filter((item, index) => array.indexOf(item) === index);// 3: "Reduce"array.reduce( (unique, item) => (unique.includes(item) ? unique : ), ,);// RESULT:// ;

# 1. Pomocí sady

dovolte mi nejprve vysvětlit, co je sada:

Set je nový datový objekt zavedený v ES6. Protože Set umožňuje ukládat pouze jedinečné hodnoty. Když předáte pole, odstraní všechny duplicitní hodnoty.

dobře, vraťme se k našemu kódu a rozebereme, co se děje. Existují 2 věci se děje:

  1. nejprve vytváříme nový Set předáním pole. Protože Set umožňuje pouze jedinečné hodnoty, všechny duplikáty budou odstraněny.
  2. duplicity jsou pryč, budeme převést zpět na pole pomocí šíření operátora ...
const array = ;// Step 1const uniqueSet = new Set(array);// Set { '🐑', 1, 2, 3 }// Step 2const backToArray = ;// 

# Convert Nastavena na Pole pomocí Pole.z

Případně můžete také použít Array.from převést Set do pole:

const array = ;Array.from(new Set(array));// 

# 2: Pomocí filtru

abychom pochopili tuto možnost, pojďme projít to, co tyto dvě metody jsou: indexOf a filter

# indexOf

indexOf metoda vrací první index najde poskytovaných prvek z našeho pole.

const array = ;array.indexOf('🐑'); // 0array.indexOf(1); // 1array.indexOf(2); // 2array.indexOf(3); // 5

# filtr

metoda filter() vytvoří nové pole prvků, které projdou podmíněným, které poskytujeme. Jinými slovy, pokud prvek projde a vrátí true, bude zahrnut do filtrovaného pole. A jakýkoli prvek, který selže nebo vrátí false, nebude ve filtrovaném poli.

pojďme vstoupit a projít tím, co se stane, když procházíme polem.

const array = ;array.filter((item, index) => { console.log( // a. Item item, // b. Index index, // c. indexOf array.indexOf(item), // d. Condition array.indexOf(item) === index, ); return array.indexOf(item) === index;});

níže je výstup z konzoly.log ukázal výše. Duplikáty jsou tam, kde index neodpovídá indexOf. Takže v těchto případech bude podmínka nepravdivá a nebude zahrnuta do našeho filtrovaného pole.

Item Index indexOf Condition
🐑 0 0 true
1 1 1 true
2 2 2 true
🐑 3 0 false
🐑 4 0 false
3 5 5 true

# Načíst duplicitní hodnoty

můžeme také použít metodu filtru k načtení duplicitních hodnot z pole. Můžeme to udělat jednoduše úpravou našeho stavu:

const array = ;array.filter((item, index) => array.indexOf(item) !== index);// 

znovu, nechte to projít a podívejte se na výstup:

Item Index indexOf Condition
🐑 0 0 false
1 1 1 false
2 2 2 false
🐑 3 0 true
🐑 4 0 true
3 5 5 false

# 3: Pomocí redukce

se metoda reduce používá ke snížení prvků pole a jejich sloučení do konečného pole na základě některé funkce redukce, kterou předáte.

v tomto případě naše funkce reduktoru kontroluje, zda naše konečné pole obsahuje položku. Pokud tomu tak není, zatlačte tuto položku do našeho konečného pole. V opačném případě přeskočte tento prvek a vraťte pouze naše konečné pole tak, jak je (v podstatě přeskočte tento prvek).

snížit je vždy trochu složitější pochopit, takže pojďme také vstoupit do každého případu a vidět výstup:

const array = ;array.reduce((unique, item) => { console.log( // a. Item item, // b. Final Array (Accumulator) unique, // c. Condition (Remember it only get pushed if this returns `false`) unique.includes(item), // d. Reducer Function Result unique.includes(item) ? unique : , ); return unique.includes(item) ? unique : ;}, ); // 👈 The initial value of our Accumulator is an empty array// RESULT:// ;

a tady je výstup z konzoly.log:

položka akumulátor (před funkcí reduktoru) zatlačte na akumulátor? Akumulátor (PO Redukční Funkce)
🐑 Ano
1 Ano
2 Ano
🐑 Ne
🐑 Ne
3 Ano

# Společenství vstup

  • @smokkku : array.includes(item) je více idiomatický způsob testování, zda pole obsahuje položku

  • @riquelkovsky : Jen dnes jsem to udělal tím, že dělá následující.Object.keys(array.reduce((map, next) => ({...map, : true}), {}))

-@luisiacc2 : Jistě, Set() bude stačit na přízemní hodnoty, s objekty, non O(n^2) řešení by bylo první provedení sort() array(která působí v O(nlogn)), a pak hledat pro adjacents stejné položky(což je O(n)) , takže máte .

  • @iamdipankarj: také Array.from(new Set()), ale to funguje pouze na primitivech. Pro filtrování duplikátů v poli vlastních objektů pole.filter() je způsob, jak jít.

  • @benawad: filter doba běhu je O(n^2)

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.