[英]filter in a nested array of object
I want to have an array that return certain property base on the checked property and also want to filter out the levels of the selected skills as possible 我想要一个数组,该数组返回基于检查属性的某些属性,并且还希望尽可能过滤掉所选技能的水平
const data = [
{
"name": "Beginner",
"skills": [
{
"name": "Skill 1",
"checked": false
},
{
"name": "Skill 2",
"checked": true
}
]
},
{
"name": "Intermediate",
"skills": [
{
"name": "Skill 1",
"checked": true
},
{
"name": "Skill 2",
"checked": false
}
]
},
{
"name": "Professional",
"skills": [
{
"name": "Skill 1",
"checked": false
},
{
"name": "Skill 2",
"checked": false
}
]
},
]
The function return the checked skills, but also return all the level objects with it 该函数返回已检查的技能,但还返回所有关卡对象
levelwithskills = data.map(level =>
Object.assign({}, level, {
skills: level.skills.filter(skill => skill.checked)
})
)
i expect to get the result in format 我希望得到格式的结果
[
{
"name": "Beginner",
"skills": [
{
"name": "Skill 2",
"checked": true
}
]
},
{
"name": "Intermediate",
"skills": [
{
"name": "Skill 1",
"checked": true
}
]
}
]
After mapping, filter
by whether an item has any skills
: 映射后,按项目是否具有任何
skills
filter
:
const data = [{ "name": "Beginner", "skills": [{ "name": "Skill 1", "checked": false }, { "name": "Skill 2", "checked": true } ] }, { "name": "Intermediate", "skills": [{ "name": "Skill 1", "checked": true }, { "name": "Skill 2", "checked": false } ] }, { "name": "Professional", "skills": [{ "name": "Skill 1", "checked": false }, { "name": "Skill 2", "checked": false } ] }, ] levelwithskills = data .map(level => ({ ...level, skills: level.skills.filter(skill => skill.checked) })) .filter(({ skills }) => skills.length) console.log(levelwithskills);
You can do it with Array#reduce
method. 您可以使用
Array#reduce
方法来实现。
const levelwithskills = data.reduce((arr, level) => {
// filter skills
let skills = level.skills.filter(({ checked }) => checked);
// check length of filtered skills if greater than 0 then push into array
skills.length && arr.push({ ...level, skills });
// return array reference
return arr
// set initial value as an empty array for the result
}, [])
const data = [{ "name": "Beginner", "skills": [{ "name": "Skill 1", "checked": false }, { "name": "Skill 2", "checked": true } ] }, { "name": "Intermediate", "skills": [{ "name": "Skill 1", "checked": true }, { "name": "Skill 2", "checked": false } ] }, { "name": "Professional", "skills": [{ "name": "Skill 1", "checked": false }, { "name": "Skill 2", "checked": false } ] }, ]; const levelwithskills = data.reduce((arr, level) => { let skills = level.skills.filter(({ checked }) => checked); skills.length && arr.push({ ...level, skills }); return arr }, []) console.log(levelwithskills)
const data = [ { "name": "Beginner", "skills": [ { "name": "Skill 1", "checked": false }, { "name": "Skill 2", "checked": true } ] }, { "name": "Intermediate", "skills": [ { "name": "Skill 1", "checked": true }, { "name": "Skill 2", "checked": false } ] }, { "name": "Professional", "skills": [ { "name": "Skill 1", "checked": false }, { "name": "Skill 2", "checked": false } ] }, ] let newData = data.map(d=>({ ...d, skills: d.skills.filter(fd=>fd.checked) })).filter(afd=>afd.skills.length) console.log(newData);
Also, we can do this as 另外,我们可以这样做
const data = [ { "name": "Beginner", "skills": [ { "name": "Skill 1", "checked": false }, { "name": "Skill 2", "checked": true } ] }, { "name": "Intermediate", "skills": [ { "name": "Skill 1", "checked": true }, { "name": "Skill 2", "checked": false } ] }, { "name": "Professional", "skills": [ { "name": "Skill 1", "checked": false }, { "name": "Skill 2", "checked": false } ] }, ] let filteredData=[] data.map((obj)=>{ obj.skills.map((innerObj)=>{ if(innerObj.checked===true){ filteredData.push({name:obj.name, skills:innerObj}) } }) }) console.log(filteredData)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.