繁体   English   中英

过滤对象的嵌套数组

[英]filter in a nested array of object

我想要一个数组,该数组返回基于检查属性的某些属性,并且还希望尽可能过滤掉所选技能的水平

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 =>
              Object.assign({}, level, {
              skills: level.skills.filter(skill => skill.checked)
            })
          )

我希望得到格式的结果

   [
      {
        "name": "Beginner",
        "skills": [
          {
            "name": "Skill 2",
            "checked": true
          }
        ]
      },
      {
        "name": "Intermediate",
        "skills": [
          {
            "name": "Skill 1",
            "checked": true
          }
        ]
      }
    ]

映射后,按项目是否具有任何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); 

您可以使用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); 

另外,我们可以这样做

 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM