Cómo filtrar un objeto en JavaScript
-
Usar
reducepara filtrar un objeto en JavaScript -
Usa la función
mappara 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-valordel 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óninnerFilterFunctionserán las claves filtradas. La salida eschemistry, languagesen 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}