Cómo filtrar un objeto en JavaScript
-
Usar
reduce
para filtrar un objeto en JavaScript -
Usa la función
map
para filtrar los objetos de JavaScript
Este tutorial introducirá cómo filtrar un objeto en JavaScript. Aprenderemos a implementar un método de filter
similar al del tipo de datos del Object
en JavaScript.
Usar reduce
para filtrar un objeto en JavaScript
Ahora vamos a implementar la función de filtrar objetos usando la función reduce
.
Supongamos que tenemos el siguiente objeto:
var grades = {linearAlgebra: 90, chemistry: 95
biology: 90
languages : 96
}
El objeto anterior representa las calificaciones de un estudiante; necesitamos filtrar ese objeto y sólo obtenemos las materias con una calificación de 95 o más.
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);
Resultado:
"The grades are ", {
biology: 90,
chemistry: 95,
languages: 96,
linearAlgebra: 90
}
"Target Subjects are ", {
chemistry: 95,
languages: 96
}
Implementamos la función Object.filter
como Object.filter = function(mainObject, filterFunction)
en el ejemplo anterior. Podemos simplificar ese código de ejemplo como se muestra a continuación.
Object.filter = function(mainObject, filterFunction) {
return Object.keys(mainObject)
.filter(innerFilterFunction)
.reduce(reduceFunction, {});
}
Tiene 3 pasos principales para implementar esa función Object.filter
:
Object.keys()
devuelve un conjunto de claves de los paresclave-valor
del objeto. En nuestro ejemplo, eslinearAlgebra, chemistry, biology, languages
.- El resultado del
Object.keys()
se envía a la función de devolucióninnerFilterFunction
, que también es un argumento de la función de filtro, y la salida de esa funcióninnerFilterFunction
serán las claves filtradas. La salida eschemistry, languages
en nuestro ejemplo. - El resultado del filtro se pasa ahora a nuestra función
reduce()
, que añade cada valor a su clave, y devuelve un nuevo objeto que contiene todos esos pares. Así que el resultado en nuestro ejemplo es{chemistry: 95, languages: 96}
.
Si queremos recrear el ejemplo anterior con la sintaxis arrow
de ES6, podríamos reescribirlo como sigue.
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);
Resultado:
The grades are {linearAlgebra: 90, chemistry: 95, biology: 90, languages: 96}
Target Subjects are {chemistry: 95, languages: 96}
Utiliza el operador coma
para devolver el objeto result
, y también puede ser sustituido por Object.assign
, que devuelve el resultado también. Así que el código puede ser reescrito como sigue.
Object.filter = (mainObject, filterFunction) =>
Object.keys(mainObject)
.filter((ObjectKey) => filterFunction(mainObject[ObjectKey]))
.reduce(
(result, ObjectKey) =>
Object.assign(result, {[ObjectKey]: mainObject[ObjectKey]}),
{});
Usa la función map
para filtrar los objetos de JavaScript
Como usamos la función reduce
en la solución anterior, también podemos usar la función map
para filtrar los objetos de 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]};
}));
}
Reemplazamos la función reduce
por la función map
como se muestra arriba, y también usamos el Object.assign
y le enviamos usando la sintaxis spread
todas las operaciones que comienzan desde Object.keys()
hasta map
, así que la implementación completa debería ser como la siguiente:
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);
Resultado:
The grades are {linearAlgebra: 90, chemistry: 95, biology: 90, languages: 96}
Target Subjects are {chemistry: 95, languages: 96}