Dada una serie de objetos:
people = [
{id: "1", name: "abc", gender: "m", age:"15" },
{id: "2", name: "a", gender: "m", age:"25" },
{id: "3", name: "efg", gender: "f", age:"5" },
{id: "4", name: "hjk", gender: "m", age:"35" },
{id: "5", name: "ikly", gender: "m", age:"41" },
{id: "6", name: "ert", gender: "f", age:" 30" },
{id: "7", name: "qwe", gender: "f", age:" 31" },
{id: "8", name: "bdd", gender: "m", age:" 78" },
]
Y una serie de identificadores buscados:
id_filter = [1,4,5,8]
¿Cómo filtrar personas en una matriz para devolver los ID de destino definidos en id_filter y de género=m?
2
Utilice const o let para declarar variables, por ejemplo const people = [].
- caja de ideas23/10/2017 a las 17:06
La forma más sencillafiltrar es usar la función filter() de la matriz, similar a esta:
people.filter(person => id_filter.includes(person.id))
Respondido 23/10/2017 a las 16:45
Joe SassonJoe Sasson
1.091
6
6 insignias de plata
8
8 insignias de bronce
3
¿Qué pasa si quiero agregar otra condición de que el género debe ser == m?
– ios_star23/10/2017 a las 16:48
personas.filtro((persona) => persona.género == 'm')
- Joe Sasson23/10/2017 a las 17:02
2
Realmente sería people.filter((person) => id_filter.includes(Number(person.id)) && person.gender === "m") o people.filter(({ id, género }) => id_filter.includes(Número(id)) && género === "m").
- Sebastián Simón6 junio 2020 a las 16:45
Puedes usar array.filter() con algunas condiciones para obtener el resultado que deseas. También he corregido tu JSON.
var filtered = people.filter(function(item) {
return id_filter.indexOf(item.id) !== -1 && item.gender==='m';
});
DEMOSTRACIÓN
var people =[
{ "id": 1, "name": "abc", "gender": "m","age": "15" },
{ "id": 2, "name": "a", "gender": "m", "age": "25" },
{ "id": 3,"name": "efg", "gender": "f","age": "5" },
{ "id": 4,"name": "hjk","gender": "m","age": "35" },
{ "id": 5, "name": "ikly","gender": "m","age": "41" },
{ "id": 6, "name": "ert", "gender": "f", "age": "30" },
{ "id": 7, "name": "qwe", "gender": "f", "age": "31" },
{ "id":8, "name": "bdd", "gender": "m", "age": " 8" }
];
var id_filter = [1,4,5,8];
var filtered = people.filter(function(item) {
return id_filter.indexOf(item.id) !== -1 && item.gender==='m';
});
console.log(filtered);
0
Con Array.inclufunción des():
var people = [
{id : "1", name : "abc", gender : "m", age :"15" }, {id : "2", name : "a", gender : "m", age :"25" },
{id : "3", name : "efg", gender : "f", age :"5" }, {id : "4", name : "hjk", gender : "m", age :"35" },
{id : "5", name : "ikly", gender : "m", age :"41" }, {id : "6", name : "ert", gender : "f", age :" 30" },
{id : "7", name : "qwe", gender : "f", age :" 31" }, {id : "8", name : "bdd", gender : "m", age :" 78" }
],
id_filter = [1,4,5,8],
result = people.filter((o) => id_filter.includes(+o.id) && o.gender == "m");
console.log(result);
+o.id - + se usa aquí para convertir una cadena numérica en un número
Puedes lograrlo con el siguiente código:
const filtered_people = people.filter(function(person){
return id_filter.includes(person.id) && person.gender === 'm';
});
Solo asegúrese de que la identificación de cada persona sea un número entero y no una cadena, como en su ejemplo. De lo contrario, la función incluye() no coincidirá. Además, su conjunto de personas tiene problemas de sintaxis internos. Entonces, el código final quedaría así:
const people = [
{id: 1, name: "abc", gender: "m", age:15},
{id: 2, name: "a", gender: "m", age: 25},
{id: 3, name: "efg", gender: "f", age: 5},
{id: 4, name: "hjk", gender: "f", age: 35},
{id: 5, name: "ikly", gender: "m", age: 41},
{id: 6, name: "ert", gender: "f", age: 30},
{id: 7, name: "qwe", gender: "f", age: 31},
{id: 8, name: "bdd", gender: "m", age: 78}
]
const id_filter = [1,4,5,8]
const filtered_people = people.filter((person) => id_filter.includes(person.id) && person.gender === 'm')
console.log(filtered_people)
Espero que esto te ayude. Buena suerte.
Respondido23/10/2017 a las 16:52
Cleber AlcântaraCleber Alcântara
423
4
4 insignias de plata
10
10 insignias de bronce
Para este caso, puede utilizar la función de filtro e inclusión, ya que sus ID son cadenas, es necesario analizarlas antes de usarlas.
var result = people.filter((person) => (id_filter.includes(parseInt(person.id)) && person.gender ==='m'))
en este caso tiene más sentido hacerlo a pie Así que primero necesitas iterar a través de tu conjunto de personas. luego verificas si la identificación de una persona es igual a tu lista de filtros
for(person in people) {
for(id in id_filter) {
if(person[id] == id && person[gender] == "m"){
}
}
}
1
Quiero una matriz filtrada y además los identificadores no están en serie. También es necesario agregar otra condición: el género es = m
-ios_star23/10/2017 a las 16:45
Puedes usar Array.prototype.filter como:
function filter(arr, ids, gender) { // takes an array of people arr, an array of indexes ids, and a gender and return the matched people objects from arr
return arr.filter(function(obj) { // filtering each object...
return ids.includes(obj.id) && obj.gender === gender; // if this object is is included in the ids array and if its gender property is equal to the desired gender
});
}
var people = [{id:"1",name:"abc",gender:"m",age:"15"},{id:"2",name:"a",gender:"m",age:"25"},{id:"3",name:"efg",gender:"f",age:"5"},{id:"4",name:"hjk",gender:"m",age:"35"},{id:"5",name:"ikly",gender:"m",age:"41"},{id:"6",name:"ert",gender:"f",age:"30"},{id:"7",name:"qwe",gender:"f",age:"31"},{id:"8",name:"bdd",gender:"m",age:"78"}];
console.log(filter(people, ["5", "7", "4"], "m")); // filtering elements where id is one of ["5", "7", "4"] and the gender is "m".
Nota: La propiedad id de los objetos en personas son cadenas, por lo que debe proporcionar una matriz de identificadores de cadena para filtrar o convertir la propiedad id en un número antes de pasarla a include.
Si su id_filter es grande, primero querrá convertirlo a un nuevo Set(). Esto permitirá una búsqueda en tiempo constante. Luego puede iterar su matriz de personas usando .filter() y devolver verdadero si su conjunto .ha() la identificación que contiene y si el género es igual a 'm'.
const people = [ {id: "1", name: "abc", gender: "m", age:"15" }, {id: "2", name: "a", gender: "m", age:"25" }, {id: "3", name: "efg", gender: "f", age:"5" }, {id: "4", name: "hjk", gender: "m", age:"35" }, {id: "5", name: "ikly", gender: "m", age:"41" }, {id: "6", name: "ert", gender: "f", age:" 30" }, {id: "7", name: "qwe", gender: "f", age:" 31" }, {id: "8", name: "bdd", gender: "m", age:" 78" }, ];
const id_filter = new Set([1,4,5,8]);
const res = people.filter(({id, gender}) => id_filter.has(+id) && gender === 'm');
console.log(res);
En general, la complejidad temporal para este enfoque será O(N + k) a diferencia de la O(Nk) que obtendría si estuviera usando el enfoque .includes() o .indexOf(), donde N es el longitud de la matriz de personas, y k es la longitud de la matriz id_filter
const people = [
{id: "1", name: "abc", gender: "m", age: "15" },
{id: "2", name: "a", gender: "m", age: "25" },
{id: "3", name: "efg", gender: "f", age: "5" },
{id: "4", name: "hjk", gender: "m", age: "35" },
{id: "5", name: "ikly", gender: "m", age: "41" },
{id: "6", name: "ert", gender: "f", age: " 30" },
{id: "7", name: "qwe", gender: "f", age: " 31" },
{id: "8", name: "bdd", gender: "m", age: " 78" },
]
const idFilter = [1,4,5,8]
const idIsInList = id => idFilter.includes(+id) // "+id" to make sure it is a number, not a string
const genderIsMale = gender => gender === "m"
const result = people.filter(item => idIsInList(item.id) && genderIsMale(item.gender))
console.log(result)
people = [
{id : "1", name : "abc", gender : "m", age :"15" },
{id : "2", name : "a", gender : "m", age :"25" },
{id : "3", name : "efg", gender : "f", age :"5" },
{id : "4", name : "hjk", gender : "m", age :"35" },
{id : "5", name : "ikly", gender : "m", age :"41" },
{id : "6", name : "ert", gender : "f", age :" 30" },
{id : "7", name : "qwe", gender : "f", age :" 31" },
{id : "8", name : "bdd", gender : "m", age :" 78" }
]
var id_filter = ["1","4","5","8"], filteredPeople = [];
for( var i=people.length-1; i>=0; --i){
if( id_filter.indexOf( people[i].id ) != -1 ){
filteredPeople.push( people[i] );
}
}
console.log( filteredPeople );