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:
- nejprve vytváříme nový
Set
předáním pole. ProtožeSet
umožňuje pouze jedinečné hodnoty, všechny duplikáty budou odstraněny. - 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 jeO(n^2)