Filtrar objecto em JavaScript
-
Utilizar o
reducepara filtrar um objecto em JavaScript -
Utilize a função
mappara filtrar objectos JavaScript
Este tutorial irá introduzir como filtrar um objecto em JavaScript. Aprenderemos como implementar um método de “filtro” semelhante ao do tipo de dados Object em JavaScript.
Utilizar o reduce para filtrar um objecto em JavaScript
Vamos agora implementar a função de filtragem de objectos utilizando a função reduce.
Suponhamos que temos o seguinte objecto:
var grades = {linearAlgebra: 90, chemistry: 95
biology: 90
languages : 96
}
O objecto acima representa as notas de um estudante; precisamos de filtrar esse objecto e obter apenas as disciplinas com uma nota de 95 ou mais.
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 a função Object.filter como Object.filter = function(mainObject, filterFunction) no exemplo acima. Podemos simplificar esse código de exemplo como abaixo.
Object.filter = function(mainObject, filterFunction) {
return Object.keys(mainObject)
.filter(innerFilterFunction)
.reduce(reduceFunction, {});
}
Tem 3 passos principais para implementar essa função Object.filter:
Object.keys()retorna um array de chaves dos pareskey-valueno objecto. ÉlinearAlgebra, chemistry, biology, languagesno nosso exemplo.- O resultado do
Object.keys()é enviado para a funçãoinnerFilterFunction, que é também um argumento da função de filtro, e a saída dessa funçãoinnerFilterFilterFunctionserá as chaves filtradas. A saída échemistry, languagesno nosso exemplo. - O resultado do filtro é agora passado para a nossa função
reduce(), que acrescenta cada valor à sua chave, e devolve um novo objecto contendo todos esses pares. Assim, o resultado no nosso exemplo é{chemistry: 95, languages: 96}.
Se quisermos recriar o exemplo acima com a sintaxe arrow de ES6, poderíamos reescrevê-lo como abaixo.
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 o operador comma para devolver o objecto result, e também pode ser substituído por Object.assign, que também devolve o resultado. Assim, o código pode ser reescrito como se segue.
Object.filter = (mainObject, filterFunction) =>
Object.keys(mainObject)
.filter((ObjectKey) => filterFunction(mainObject[ObjectKey]))
.reduce(
(result, ObjectKey) =>
Object.assign(result, {[ObjectKey]: mainObject[ObjectKey]}),
{});
Utilize a função map para filtrar objectos JavaScript
Como utilizamos a função reduce na solução acima, podemos também utilizar a função map para filtrar objectos 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]};
}));
}
Substituímos a função reduce pela função map, como mostrado acima, e também utilizámos a função Object.assign e enviámos-lhe utilizando a sintaxe spread todas as operações que começam em Object.keys() a .map(), pelo que a implementação completa deve agora ser como a seguinte:
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}