2016-07-05 15 views
6

Devo filtrare il mio array per contenere solo valori univoci. questo è il mio dati di matriceFiltra l'array per avere solo valori univoci

["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"] 

risultato atteso dovrebbe essere

["X_row7", "X_row4", "X_row6", "X_row10", "X_row11", "X_row8"] 

come dovrei continuare il mio codice per ottenere il corretto risultato.

newArray = []; 
for(n in data){ 
    if(!newArray.indexOf(n)){ 
    newArray.push(n); 
    } 
} 
console.log(newArray); 

Se avete bisogno di ulteriori informazioni per favore fatemi sapere e fornirò. grazie

+0

Eventuali duplicati di [valori unici in un array] (http://stackoverflow.com/questions/1960473/unique-values- in-an-array) – Schleis

+0

'[" X_row7 "," X_row4 "," X_row6 "," X_row10 "," X_row8 "," X_row9 "," X_row11 "," X_row7 "," X_row4 "," X_row6 "," X_row10 "," X_row8 "," X_row9 "," X_row11 "," X_row7 "," X_row4 "," X_row6 "," X_row10 "," X_row8 "," X_row9 "," X_row11 ", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9 "," X_row11 "," X_row7 "," X_row4 "," X_row6 "," X_row10 "," X_row8 "," X_row9 "," X_row11 "]. Filter (funzione (v, i, arr) {return i == arr.indexOf (v); }) ' –

+0

Possibile duplicato di [Come ottenere valori univoci in un array] (https://stackoverflow.com/questions/11246758/how-to-get-unique-values-in-an-array) –

risposta

24

È possibile utilizzare la funzione Array.filter per filtrare gli elementi di un array in base al valore di ritorno di una funzione di richiamata. La funzione di callback viene eseguita per ogni elemento dell'array originale.

La logica per la funzione di callback qui è che se il valore indexOf per l'elemento corrente è uguale all'indice, significa che l'elemento è stato rilevato la prima volta, quindi può essere considerato univoco. In caso contrario, significa che l'elemento è già stato rilevato, quindi dovrebbe essere scartato ora.

var arr = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]; 
 

 
var filteredArray = arr.filter(function(item, pos){ 
 
    return arr.indexOf(item)== pos; 
 
}); 
 

 
console.log(filteredArray);

UPDATE (16 nov 2017)

Se si può fare affidamento su ES6 features, quindi è possibile utilizzare Set object e Spread operator per creare una matrice unica da un dato array, come già specificato nella risposta di @Travis Heeter qui sotto:

var uniqueArray = [...new Set(array)] 
+1

questo è brillante – oMiKeY

5

È possibile utilizzare una tabella hash per la ricerca e filtrare tutti i valori non inclusi.

var data = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"], 
 
    unique = data.filter(function (a) { 
 
     return !this[a] && (this[a] = true); 
 
    }, Object.create(null)); 
 

 
console.log(unique);

2

È possibile utilizzare reduce al ciclo matrice e ottenere il Non duplicare i valori. Utilizza anche un object ausiliario per ottenere il conteggio dei valori aggiunti.

var aux = {}; 
 

 
var newArray = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"].reduce((tot, curr)=>{ 
 
    if(!aux[curr]){ 
 
    aux[curr] = 1; 
 
    tot.push(curr); 
 
    } 
 
    return tot; 
 
}, []); 
 

 
console.log(newArray);

3

È possibile utilizzare Map e Spread Operator:

var rawData = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]; 
 

 
var unique = new Map(); 
 
rawData.forEach(d => unique.set(d, d)); 
 
var uniqueItems = [...unique.keys()]; 
 

 
console.log(uniqueItems);

11

A partire dal 15 giugno 2015 è possibile utilizzare Set() per creare una gamma unica:

var uniqueArray = [...new Set(array)] 

Per esempio:

var data = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"] 
var newArray = [...new Set(data)] 
console.log(newArray) 

>> ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"] 
3

arr = ["I", "do", "love", "JavaScript", "and", "I", "also", "do", "love", "Java"]; 
 

 
uniqueArr = [... new Set(arr)]; 
 

 
// or 
 

 
reallyUniqueArr = arr.filter((item, pos, ar) => ar.indexOf(item) === pos) 
 

 
console.log(`${uniqueArr}\n${reallyUniqueArr}`)

+1

Si prega di fornire contesto al codice –

1

Una leggera variazione del metodo indexOf, se avete bisogno di filtrare più array:

function unique(item, index, array) { 
    return array.indexOf(item) == index; 
} 

Usa come tale:

arr.filter(unique); 
1

ho sempre usato:

unique = (arr) => arr.filter((item, i, s) => s.lastIndexOf(item) == i); 

Ma di recente ho dovuto ottenere valori unici per:

["1", 1, "2", 2, "3", 3] 

E il mio vecchio standby non tagliarlo, così sono venuto con:

uunique = (arr) => Object.keys(Object.assign({}, ...arr.map(a=>({[a]:true})))); 
1

Filtraggio di un array per contenere univoco I valori possono essere raggiunti utilizzando il JavaScript Set e metodo Array.from, come illustrato di seguito:

Array.from(new Set(arrayOfNonUniqueValues));

Set

L'oggetto Set consente di memorizzare i valori unici di qualsiasi tipo, sia valori primitivi o riferimenti a oggetti.

Valore restituito Un nuovo oggetto Set.

Array.from()

Il metodo Array.from() crea una nuova istanza Array da un oggetto matrice simile o iterabile.

Valore restituito Una nuova istanza Array.

Esempio di codice:

const array = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"] 
 

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

 
console.log("uniqueArray: ", uniqueArray);