Filtra oggetto in JavaScript
-
Usa
reduceper filtrare l’oggetto in JavaScript -
Usa la funzione
mapper filtrare gli oggetti JavaScript
Questo tutorial introdurrà come filtrare un oggetto in JavaScript. Impareremo come implementare un metodo filter simile come nel tipo di dati array a Object in JavaScript.
Usa reduce per filtrare l’oggetto in JavaScript
Implementiamo ora la funzione per filtrare gli oggetti usando la funzione reduce.
Supponiamo di avere il seguente oggetto:
var grades = {linearAlgebra: 90, chemistry: 95
biology: 90
languages : 96
}
L’oggetto sopra rappresenta i voti di uno studente; dobbiamo filtrare quell’oggetto e ottenere solo i soggetti con un voto di 95 o più.
var grades = {linearAlgebra: 90, chemistry: 95, biology: 90, languages: 96};
Object.filter =
function(mainObject, filterFunction) {
return Object.keys(mainObject)
.filter(function(ObjectKey) {
return filterFunction(mainObject[ObjectKey])
})
.reduce(function(result, ObjectKey) {
result[ObjectKey] = mainObject[ObjectKey];
return result;
}, {});
}
console.log('The grades are ', grades);
var targetSubjects = Object.filter(grades, function(grade) {
return grade >= 95;
});
console.log('Target Subjects are ', targetSubjects);
Produzione:
"The grades are ", {
biology: 90,
chemistry: 95,
languages: 96,
linearAlgebra: 90
}
"Target Subjects are ", {
chemistry: 95,
languages: 96
}
Implementiamo la funzione Object.filter come Object.filter = function(mainObject, filterFunction) nell’esempio precedente. Possiamo semplificare quel codice di esempio come di seguito.
Object.filter = function(mainObject, filterFunction) {
return Object.keys(mainObject)
.filter(innerFilterFunction)
.reduce(reduceFunction, {});
}
Ha 3 passaggi principali per implementare la funzione Object.filter:
Object.keys()restituisce un array di chiavi dalle coppiechiave-valorenell’oggetto. Nel nostro esempio èlinearAlgebra, chemistry, biology, languages.- Il risultato di
Object.keys()viene inviato alla funzione di callbackinnerFilterFunction, che è anche un argomento della funzione filtro, e l’output di quella funzioneinnerFilterFunctionsaranno le chiavi filtrate. L’output èchemistry, languagesnel nostro esempio. - Il risultato del filtro viene ora passato alla nostra funzione
reduce(), che aggiunge ogni valore alla sua chiave e restituisce un nuovo oggetto contenente tutte quelle coppie. Quindi il risultato nel nostro esempio è{chemistry: 95, languages: 96}.
Se vogliamo ricreare l’esempio precedente con la sintassi a arrow di ES6, potremmo riscriverlo come sotto.
var grades = {linearAlgebra: 90, chemistry: 95, biology: 90, languages: 96};
Object.filter = (mainObject, filterFunction) =>
Object.keys(mainObject)
.filter((ObjectKey) => filterFunction(mainObject[ObjectKey]))
.reduce(
(result, ObjectKey) =>
(result[ObjectKey] = mainObject[ObjectKey], result),
{});
console.log('The grades are ', grades);
var targetSubjects = Object.filter(grades, (grade) => grade >= 95);
console.log('Target Subjects are ', targetSubjects);
Produzione:
The grades are {linearAlgebra: 90, chemistry: 95, biology: 90, languages: 96}
Target Subjects are {chemistry: 95, languages: 96}
Utilizza l’operatore comma per restituire l’oggetto result, e può anche essere sostituito con Object.assign, che restituisce anche il risultato. Quindi il codice può essere riscritto come segue.
Object.filter = (mainObject, filterFunction) =>
Object.keys(mainObject)
.filter((ObjectKey) => filterFunction(mainObject[ObjectKey]))
.reduce(
(result, ObjectKey) =>
Object.assign(result, {[ObjectKey]: mainObject[ObjectKey]}),
{});
Usa la funzione map per filtrare gli oggetti JavaScript
Poiché utilizziamo la funzione reduce nella soluzione precedente, possiamo anche utilizzare la funzione map per filtrare gli oggetti JavaScript.
Object.filter = function(mainObject, filterFunction) {
return Object.assign(...Object.keys(mainObject)
.filter(function(ObjectKey) {
return filterFunction(mainObject[ObjectKey])
})
.map(function(ObjectKey) {
return {[ObjectKey]: mainObject[ObjectKey]};
}));
}
Abbiamo sostituito la funzione reduce con la funzione map come mostrato sopra, e abbiamo anche usato Object.assign e gli abbiamo inviato utilizzando la sintassi spread tutte le operazioni a partire da Object.keys() a map, quindi l’implementazione completa dovrebbe ora essere come la seguente:
var grades = {linearAlgebra: 90, chemistry: 95, biology: 90, languages: 96};
Object.filter =
function(mainObject, filterFunction) {
return Object.assign(...Object.keys(mainObject)
.filter(function(ObjectKey) {
return filterFunction(mainObject[ObjectKey])
})
.map(function(ObjectKey) {
return {[ObjectKey]: mainObject[ObjectKey]};
}));
}
console.log('The grades are ', grades);
var targetSubjects = Object.filter(grades, (grade) => grade >= 95);
console.log('Target Subjects are ', targetSubjects);
Produzione:
The grades are {linearAlgebra: 90, chemistry: 95, biology: 90, languages: 96}
Target Subjects are {chemistry: 95, languages: 96}