const data = [
{
id: 1,
pany: "Photosnap",
logo: "./images/photosnap.svg",
new: true,
featured: true,
position: "Senior Frontend Developer",
role: "Frontend",
level: "Senior",
postedAt: "1d ago",
contract: "Full Time",
location: "USA Only",
languages: ["HTML", "CSS", "JavaScript"]
},
{
id: 2,
pany: "Manage",
logo: "./images/manage.svg",
new: true,
featured: true,
position: "Fullstack Developer",
role: "Fullstack",
level: "Midweight",
postedAt: "1d ago",
contract: "Part Time",
location: "Remote",
languages: ["Python"],
tools: ["React"]
},
{
id: 3,
pany: "Account",
logo: "./images/account.svg",
new: true,
featured: false,
position: "Junior Frontend Developer",
role: "Frontend",
level: "Junior",
postedAt: "2d ago",
contract: "Part Time",
location: "USA Only",
languages: ["JavaScript"],
tools: ["React", "Sass"]
},
{
id: 4,
pany: "MyHome",
logo: "./images/myhome.svg",
new: false,
featured: false,
position: "Junior Frontend Developer",
role: "Frontend",
level: "Junior",
postedAt: "5d ago",
contract: "Contract",
location: "USA Only",
languages: ["CSS", "JavaScript"]
},
{
id: 5,
pany: "Loop Studios",
logo: "./images/loop-studios.svg",
new: false,
featured: false,
position: "Software Engineer",
role: "FullStack",
level: "Midweight",
postedAt: "1w ago",
contract: "Full Time",
location: "Worldwide",
languages: ["JavaScript"],
tools: ["Ruby", "Sass"]
},
{
id: 6,
pany: "FaceIt",
logo: "./images/faceit.svg",
new: false,
featured: false,
position: "Junior Backend Developer",
role: "Backend",
level: "Junior",
postedAt: "2w ago",
contract: "Full Time",
location: "UK Only",
tools: ["RoR"]
},
{
id: 7,
pany: "Shortly",
logo: "./images/shortly.svg",
new: false,
featured: false,
position: "Junior Developer",
role: "Frontend",
level: "Junior",
postedAt: "2w ago",
contract: "Full Time",
location: "Worldwide",
languages: ["HTML", "JavaScript"],
tools: ["Sass"]
},
{
id: 8,
pany: "Insure",
logo: "./images/insure.svg",
new: false,
featured: false,
position: "Junior Frontend Developer",
role: "Frontend",
level: "Junior",
postedAt: "2w ago",
contract: "Full Time",
location: "USA Only",
languages: ["JavaScript"],
tools: ["Vue, Sass"]
},
{
id: 9,
pany: "Eyecam Co.",
logo: "./images/eyecam-co.svg",
new: false,
featured: false,
position: "Full Stack Engineer",
role: "Fullstack",
level: "Midweight",
postedAt: "3w ago",
contract: "Full Time",
location: "Worldwide",
languages: ["JavaScript", "Python"],
tools: ["Django"]
},
{
id: 10,
pany: "The Air Filter Company",
logo: "./images/the-air-filter-pany.svg",
new: false,
featured: false,
position: "Front-end Dev",
role: "Frontend",
level: "Junior",
postedAt: "1mo ago",
contract: "Part Time",
location: "Worldwide",
languages: ["JavaScript"],
tools: ["React", "Sass"]
}
];
// const filters = ['Python']
// const arrayOfTags = data.map(item => [item.level, item.role].concat(item.tools,item.languages))
// let filteredArr = arrayOfTags.forEach((tag,i) => {
// filters.forEach((filter,j) => {
// })
// })
// console.log(filteredArr)
const data = [
{
id: 1,
pany: "Photosnap",
logo: "./images/photosnap.svg",
new: true,
featured: true,
position: "Senior Frontend Developer",
role: "Frontend",
level: "Senior",
postedAt: "1d ago",
contract: "Full Time",
location: "USA Only",
languages: ["HTML", "CSS", "JavaScript"]
},
{
id: 2,
pany: "Manage",
logo: "./images/manage.svg",
new: true,
featured: true,
position: "Fullstack Developer",
role: "Fullstack",
level: "Midweight",
postedAt: "1d ago",
contract: "Part Time",
location: "Remote",
languages: ["Python"],
tools: ["React"]
},
{
id: 3,
pany: "Account",
logo: "./images/account.svg",
new: true,
featured: false,
position: "Junior Frontend Developer",
role: "Frontend",
level: "Junior",
postedAt: "2d ago",
contract: "Part Time",
location: "USA Only",
languages: ["JavaScript"],
tools: ["React", "Sass"]
},
{
id: 4,
pany: "MyHome",
logo: "./images/myhome.svg",
new: false,
featured: false,
position: "Junior Frontend Developer",
role: "Frontend",
level: "Junior",
postedAt: "5d ago",
contract: "Contract",
location: "USA Only",
languages: ["CSS", "JavaScript"]
},
{
id: 5,
pany: "Loop Studios",
logo: "./images/loop-studios.svg",
new: false,
featured: false,
position: "Software Engineer",
role: "FullStack",
level: "Midweight",
postedAt: "1w ago",
contract: "Full Time",
location: "Worldwide",
languages: ["JavaScript"],
tools: ["Ruby", "Sass"]
},
{
id: 6,
pany: "FaceIt",
logo: "./images/faceit.svg",
new: false,
featured: false,
position: "Junior Backend Developer",
role: "Backend",
level: "Junior",
postedAt: "2w ago",
contract: "Full Time",
location: "UK Only",
tools: ["RoR"]
},
{
id: 7,
pany: "Shortly",
logo: "./images/shortly.svg",
new: false,
featured: false,
position: "Junior Developer",
role: "Frontend",
level: "Junior",
postedAt: "2w ago",
contract: "Full Time",
location: "Worldwide",
languages: ["HTML", "JavaScript"],
tools: ["Sass"]
},
{
id: 8,
pany: "Insure",
logo: "./images/insure.svg",
new: false,
featured: false,
position: "Junior Frontend Developer",
role: "Frontend",
level: "Junior",
postedAt: "2w ago",
contract: "Full Time",
location: "USA Only",
languages: ["JavaScript"],
tools: ["Vue, Sass"]
},
{
id: 9,
pany: "Eyecam Co.",
logo: "./images/eyecam-co.svg",
new: false,
featured: false,
position: "Full Stack Engineer",
role: "Fullstack",
level: "Midweight",
postedAt: "3w ago",
contract: "Full Time",
location: "Worldwide",
languages: ["JavaScript", "Python"],
tools: ["Django"]
},
{
id: 10,
pany: "The Air Filter Company",
logo: "./images/the-air-filter-pany.svg",
new: false,
featured: false,
position: "Front-end Dev",
role: "Frontend",
level: "Junior",
postedAt: "1mo ago",
contract: "Part Time",
location: "Worldwide",
languages: ["JavaScript"],
tools: ["React", "Sass"]
}
];
// const filters = ['Python']
// const arrayOfTags = data.map(item => [item.level, item.role].concat(item.tools,item.languages))
// let filteredArr = arrayOfTags.forEach((tag,i) => {
// filters.forEach((filter,j) => {
// })
// })
// console.log(filteredArr)
I'm working on a list with filtering feature.
I need to filter the array of objects based on the tags.
Take a look here -> https://codepen.io/AdamKniec/pen/BaoJvWK or at the SO code snippet
I need to return those objects that contain the tags specified in the filters
array.
Only values from the below Object's key's can be a tag.
-role
-tools
-level
-languages
I tried to implement it (mented section in the codepen example) but I failed. Could You guys please help me to implement that ? How can I achieve that with ES6 array methods ? Thank in advance. If more clarification is required - please let me know and I will update the question :)
Share Improve this question edited May 5, 2020 at 19:36 AdamKniec asked May 5, 2020 at 19:30 AdamKniecAdamKniec 1,72712 silver badges27 bronze badges 3- 1 Transfer yourv code over to this site as a minimal reproducible example – zer00ne Commented May 5, 2020 at 19:35
- Stackoverflow supports inline html/css/js and it will get executed – Ahmed I. Elsayed Commented May 5, 2020 at 19:36
- 1 I've just made an edit with the codeSnippet – AdamKniec Commented May 5, 2020 at 19:39
2 Answers
Reset to default 4You can use the Array method filter()
to limit the array of peoples.
To filter by one parameter you could use includes()
but you are using array of filters so .every()
is a better option (it behaves like AND), you could also use .some()
to find person with at least one language.
const data = [
{
id: 1,
languages: ["HTML", "JavaScript"],
},
{
id: 2,
languages: ["JavaScript"],
},
{
id: 3,
languages: ["JavaScript", "Python"],
},
{
id: 4,
languages: ["JavaScript"],
}
];
const filters = ['JavaScript']
const filterByLanguage = ( list, filters ) => {
return list.filter( person => filters.every( filter => person.languages.includes(filter) ))
}
console.log('JS')
console.log( filterByLanguage(data, ['JavaScript'] ) )
console.log('JS + Python')
console.log( filterByLanguage(data, ['JavaScript', 'Python'] ) )
You can expand those filters like this:
list.filter( person => {
const haveAllLanguages = filters.every( filter => person.languages.includes(filter) )
return haveAllLanguages && person.age > 18
}
))
You have to return true for filter() to add it to the response.
You can iterate data and then bine tags to filter. Use .some
method, to match any of filters or .every
method, to match all of filters.
const filters = ["Python", "React"];
let filteredArr = data.filter((user) => {
const tags = [user.level, user.role].concat(user.tools, user.languages);
return filters.every(f => tags.includes(f));
});
console.log(filteredArr);
Working samples:
Match all[AND]:
const data = [{"id":1,"pany":"Photosnap","logo":"./images/photosnap.svg","new":true,"featured":true,"position":"Senior Frontend Developer","role":"Frontend","level":"Senior","postedAt":"1d ago","contract":"Full Time","location":"USA Only","languages":["HTML","CSS","JavaScript"]},{"id":2,"pany":"Manage","logo":"./images/manage.svg","new":true,"featured":true,"position":"Fullstack Developer","role":"Fullstack","level":"Midweight","postedAt":"1d ago","contract":"Part Time","location":"Remote","languages":["Python"],"tools":["React"]},{"id":3,"pany":"Account","logo":"./images/account.svg","new":true,"featured":false,"position":"Junior Frontend Developer","role":"Frontend","level":"Junior","postedAt":"2d ago","contract":"Part Time","location":"USA Only","languages":["JavaScript"],"tools":["React","Sass"]},{"id":4,"pany":"MyHome","logo":"./images/myhome.svg","new":false,"featured":false,"position":"Junior Frontend Developer","role":"Frontend","level":"Junior","postedAt":"5d ago","contract":"Contract","location":"USA Only","languages":["CSS","JavaScript"]},{"id":5,"pany":"Loop Studios","logo":"./images/loop-studios.svg","new":false,"featured":false,"position":"Software Engineer","role":"FullStack","level":"Midweight","postedAt":"1w ago","contract":"Full Time","location":"Worldwide","languages":["JavaScript"],"tools":["Ruby","Sass"]},{"id":6,"pany":"FaceIt","logo":"./images/faceit.svg","new":false,"featured":false,"position":"Junior Backend Developer","role":"Backend","level":"Junior","postedAt":"2w ago","contract":"Full Time","location":"UK Only","tools":["RoR"]},{"id":7,"pany":"Shortly","logo":"./images/shortly.svg","new":false,"featured":false,"position":"Junior Developer","role":"Frontend","level":"Junior","postedAt":"2w ago","contract":"Full Time","location":"Worldwide","languages":["HTML","JavaScript"],"tools":["Sass"]},{"id":8,"pany":"Insure","logo":"./images/insure.svg","new":false,"featured":false,"position":"Junior Frontend Developer","role":"Frontend","level":"Junior","postedAt":"2w ago","contract":"Full Time","location":"USA Only","languages":["JavaScript"],"tools":["Vue, Sass"]},{"id":9,"pany":"Eyecam Co.","logo":"./images/eyecam-co.svg","new":false,"featured":false,"position":"Full Stack Engineer","role":"Fullstack","level":"Midweight","postedAt":"3w ago","contract":"Full Time","location":"Worldwide","languages":["JavaScript","Python"],"tools":["Django"]},{"id":10,"pany":"The Air Filter Company","logo":"./images/the-air-filter-pany.svg","new":false,"featured":false,"position":"Front-end Dev","role":"Frontend","level":"Junior","postedAt":"1mo ago","contract":"Part Time","location":"Worldwide","languages":["JavaScript"],"tools":["React","Sass"]}]
const filters = ["Python", "React"];
let filteredArr = data.filter((user) => {
const tags = [user.level, user.role].concat(user.tools, user.languages);
return filters.every(f => tags.includes(f));
});
console.log(filteredArr);
Match any[OR]:
const data = [{"id":1,"pany":"Photosnap","logo":"./images/photosnap.svg","new":true,"featured":true,"position":"Senior Frontend Developer","role":"Frontend","level":"Senior","postedAt":"1d ago","contract":"Full Time","location":"USA Only","languages":["HTML","CSS","JavaScript"]},{"id":2,"pany":"Manage","logo":"./images/manage.svg","new":true,"featured":true,"position":"Fullstack Developer","role":"Fullstack","level":"Midweight","postedAt":"1d ago","contract":"Part Time","location":"Remote","languages":["Python"],"tools":["React"]},{"id":3,"pany":"Account","logo":"./images/account.svg","new":true,"featured":false,"position":"Junior Frontend Developer","role":"Frontend","level":"Junior","postedAt":"2d ago","contract":"Part Time","location":"USA Only","languages":["JavaScript"],"tools":["React","Sass"]},{"id":4,"pany":"MyHome","logo":"./images/myhome.svg","new":false,"featured":false,"position":"Junior Frontend Developer","role":"Frontend","level":"Junior","postedAt":"5d ago","contract":"Contract","location":"USA Only","languages":["CSS","JavaScript"]},{"id":5,"pany":"Loop Studios","logo":"./images/loop-studios.svg","new":false,"featured":false,"position":"Software Engineer","role":"FullStack","level":"Midweight","postedAt":"1w ago","contract":"Full Time","location":"Worldwide","languages":["JavaScript"],"tools":["Ruby","Sass"]},{"id":6,"pany":"FaceIt","logo":"./images/faceit.svg","new":false,"featured":false,"position":"Junior Backend Developer","role":"Backend","level":"Junior","postedAt":"2w ago","contract":"Full Time","location":"UK Only","tools":["RoR"]},{"id":7,"pany":"Shortly","logo":"./images/shortly.svg","new":false,"featured":false,"position":"Junior Developer","role":"Frontend","level":"Junior","postedAt":"2w ago","contract":"Full Time","location":"Worldwide","languages":["HTML","JavaScript"],"tools":["Sass"]},{"id":8,"pany":"Insure","logo":"./images/insure.svg","new":false,"featured":false,"position":"Junior Frontend Developer","role":"Frontend","level":"Junior","postedAt":"2w ago","contract":"Full Time","location":"USA Only","languages":["JavaScript"],"tools":["Vue, Sass"]},{"id":9,"pany":"Eyecam Co.","logo":"./images/eyecam-co.svg","new":false,"featured":false,"position":"Full Stack Engineer","role":"Fullstack","level":"Midweight","postedAt":"3w ago","contract":"Full Time","location":"Worldwide","languages":["JavaScript","Python"],"tools":["Django"]},{"id":10,"pany":"The Air Filter Company","logo":"./images/the-air-filter-pany.svg","new":false,"featured":false,"position":"Front-end Dev","role":"Frontend","level":"Junior","postedAt":"1mo ago","contract":"Part Time","location":"Worldwide","languages":["JavaScript"],"tools":["React","Sass"]}]
const filters = ["Python", "React"];
let filteredArr = data.filter((user) => {
const tags = [user.level, user.role].concat(user.tools, user.languages);
return filters.some(f => tags.includes(f));
});
console.log(filteredArr);
More plex filter:
const filters = {
role: "Frontend",
level: "Junior",
tags: ["Python", "React"],
};
const data = [{"id":1,"pany":"Photosnap","logo":"./images/photosnap.svg","new":true,"featured":true,"position":"Senior Frontend Developer","role":"Frontend","level":"Senior","postedAt":"1d ago","contract":"Full Time","location":"USA Only","languages":["HTML","CSS","JavaScript"]},{"id":2,"pany":"Manage","logo":"./images/manage.svg","new":true,"featured":true,"position":"Fullstack Developer","role":"Fullstack","level":"Midweight","postedAt":"1d ago","contract":"Part Time","location":"Remote","languages":["Python"],"tools":["React"]},{"id":3,"pany":"Account","logo":"./images/account.svg","new":true,"featured":false,"position":"Junior Frontend Developer","role":"Frontend","level":"Junior","postedAt":"2d ago","contract":"Part Time","location":"USA Only","languages":["JavaScript"],"tools":["React","Sass"]},{"id":4,"pany":"MyHome","logo":"./images/myhome.svg","new":false,"featured":false,"position":"Junior Frontend Developer","role":"Frontend","level":"Junior","postedAt":"5d ago","contract":"Contract","location":"USA Only","languages":["CSS","JavaScript"]},{"id":5,"pany":"Loop Studios","logo":"./images/loop-studios.svg","new":false,"featured":false,"position":"Software Engineer","role":"FullStack","level":"Midweight","postedAt":"1w ago","contract":"Full Time","location":"Worldwide","languages":["JavaScript"],"tools":["Ruby","Sass"]},{"id":6,"pany":"FaceIt","logo":"./images/faceit.svg","new":false,"featured":false,"position":"Junior Backend Developer","role":"Backend","level":"Junior","postedAt":"2w ago","contract":"Full Time","location":"UK Only","tools":["RoR"]},{"id":7,"pany":"Shortly","logo":"./images/shortly.svg","new":false,"featured":false,"position":"Junior Developer","role":"Frontend","level":"Junior","postedAt":"2w ago","contract":"Full Time","location":"Worldwide","languages":["HTML","JavaScript"],"tools":["Sass"]},{"id":8,"pany":"Insure","logo":"./images/insure.svg","new":false,"featured":false,"position":"Junior Frontend Developer","role":"Frontend","level":"Junior","postedAt":"2w ago","contract":"Full Time","location":"USA Only","languages":["JavaScript"],"tools":["Vue, Sass"]},{"id":9,"pany":"Eyecam Co.","logo":"./images/eyecam-co.svg","new":false,"featured":false,"position":"Full Stack Engineer","role":"Fullstack","level":"Midweight","postedAt":"3w ago","contract":"Full Time","location":"Worldwide","languages":["JavaScript","Python"],"tools":["Django"]},{"id":10,"pany":"The Air Filter Company","logo":"./images/the-air-filter-pany.svg","new":false,"featured":false,"position":"Front-end Dev","role":"Frontend","level":"Junior","postedAt":"1mo ago","contract":"Part Time","location":"Worldwide","languages":["JavaScript"],"tools":["React","Sass"]}]
const filters = {
role: "Frontend",
level: "Junior",
tags: ["Python", "React"],
};
let filteredArr = data.filter((user) => {
const tools = (user.tools || []).concat(user.languages);
return Object.entries(filters).every(([key, value]) => {
if (typeof value === "string") {
return user[key] == value;
} else {
return value.some((f) => tools.includes(f));
}
});
});
console.log(filteredArr);
发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744838254a4596396.html
评论列表(0条)