2

I have an array with objects and I am trying to figure out how to filter out a few objects which i dont need their. I am trying to filter it out on the basis of the field code . Below is the code I have tried so far which throws an error a.filter is not a function. What could I be doing in this case. Is filter not the correct way to do it .Thank You.

var chartsArray = [
  {
    "name": "Total Educated",
    "code": "Q035001",
    "parent": "EDU_ATTAINMENT",
    "value": "9900",
    "label": "Total Educated",
    "children": []
  },
  {
    "name": "Grade  Less than 9",
    "code": "Q035003",
    "parent": "EDU_ATTAINMENT",
    "value": "369",
    "label": "Grade  9",
    "children": []
  },
  {
    "name": "Grade 9 to 12",
    "code": "Q035007",
    "parent": "EDU_ATTAINMENT",
    "value": "595",
    "label": "Grade 9 - 12",
    "children": []
  },
  {
    "name": "High School",
    "code": "Q035011",
    "parent": "EDU_ATTAINMENT",
    "value": "1174",
    "label": "High School",
    "children": []
  },
  {
    "name": "Some College",
    "code": "Q035012",
    "parent": "EDU_ATTAINMENT",
    "value": "1904",
    "label": "Some College",
    "children": []
  },
  {
    "name": "College Degree -  Associate's",
    "code": "Q035014",
    "parent": "EDU_ATTAINMENT",
    "value": "436",
    "label": "Associate's",
    "children": []
  },
  {
    "name": "College Degree -  Bachelor's",
    "code": "Q035015",
    "parent": "EDU_ATTAINMENT",
    "value": "2999",
    "label": "Bachelor's",
    "children": []
  },
  {
    "name": "College Degree -  Master's",
    "code": "Q035016",
    "parent": "EDU_ATTAINMENT",
    "value": "1763",
    "label": "Master's",
    "children": []
  },
  {
    "name": "College - Professional",
    "code": "Q035017",
    "parent": "EDU_ATTAINMENT",
    "value": "413",
    "label": "Professional",
    "children": []
  },
  {
    "name": "College Degree - Doctorate",
    "code": "Q035018",
    "parent": "EDU_ATTAINMENT",
    "value": "246",
    "label": "Doctorate",
    "children": []
  },
  {
    "name": "Enrollments (Total Population)",
    "code": "EDU_Enrollments",
    "parent": "EDU_ATTAINMENT",
    "label": "Enrollments (Total Population)",
    "children": [
      {
        "name": "Nursery school/Preschool",
        "code": "Q036003",
        "parent": "EDU_Enrollments",
        "value": "269",
        "label": "Nursery school/Preschool",
        "children": []
      },
      {
        "name": "Kindergarten/Elementary school",
        "code": "Q036006",
        "parent": "EDU_Enrollments",
        "value": "1156",
        "label": "Kindergarten/Elementary school",
        "children": []
      },
      {
        "name": "High School",
        "code": "Q036015",
        "parent": "EDU_Enrollments",
        "value": "539",
        "label": "High School",
        "children": []
      },
      {
        "name": "College/Graduate /Professional school",
        "code": "Q036018",
        "parent": "EDU_Enrollments",
        "value": "1869",
        "label": "College/Graduate /Professional school",
        "children": []
      },
      {
        "name": "Not Enrolled",
        "code": "Q036024",
        "parent": "EDU_Enrollments",
        "value": "10380",
        "label": "Not Enrolled",
        "children": []
      }
    ]
  },
  {
    "name": "Percents",
    "code": "PCT_EDU_ATTAINMENT",
    "parent": "EDU_ATTAINMENT",
    "label": "Percents",
    "children": [
      {
        "name": "% Grade  Less than 9",
        "code": "XQ035003",
        "parent": "PCT_EDU_ATTAINMENT",
        "value": "3.7231",
        "label": "% Grade  9",
        "children": []
      },
      {
        "name": "% Grade 9 to 12",
        "code": "XQ035007",
        "parent": "PCT_EDU_ATTAINMENT",
        "value": "6.0112",
        "label": "% Grade 9 - 12",
        "children": []
      },
      {
        "name": "% High school",
        "code": "XQ035011",
        "parent": "PCT_EDU_ATTAINMENT",
        "value": "11.8622",
        "label": "% High school",
        "children": []
      },
      {
        "name": "% Some college",
        "code": "XQ035012",
        "parent": "PCT_EDU_ATTAINMENT",
        "value": "19.2332",
        "label": "% Some college",
        "children": []
      },
      {
        "name": "% College - Associate",
        "code": "XQ035014",
        "parent": "PCT_EDU_ATTAINMENT",
        "value": "4.4073",
        "label": "Associate",
        "children": []
      },
      {
        "name": "% College - Bachelors",
        "code": "XQ035015",
        "parent": "PCT_EDU_ATTAINMENT",
        "value": "30.2966",
        "label": "Bachelors",
        "children": []
      },
      {
        "name": "% College - Masters",
        "code": "XQ035016",
        "parent": "PCT_EDU_ATTAINMENT",
        "value": "17.8096",
        "label": "Masters",
        "children": []
      },
      {
        "name": "% College - Professional",
        "code": "XQ035017",
        "parent": "PCT_EDU_ATTAINMENT",
        "value": "4.168",
        "label": "Professional",
        "children": []
      },
      {
        "name": "% College - Doctorate",
        "code": "XQ035018",
        "parent": "PCT_EDU_ATTAINMENT",
        "value": "2.4888",
        "label": "Doctorate",
        "children": []
      }
    ]
  }
];

var el=[
   "Q035001",
   "PCT_EDU_ATTAINMENT"
];

output = chartsArray = chartsArray.map(a => a.filter(function code(o) {
    if (!el.includes(o.code)) {
        if (o.children) {
            o.children = o.children.filter(code);
        }
        return true;
    }
}));


console.log(output)

1
  • @SamHartman yes Commented Nov 9, 2017 at 20:35

2 Answers 2

2

chartsArray is an array of objects. When you do chartsArray.map(a => a.filter(...)), it means that for each object a in the array, invoke filter. Which is incorrect since objects don't have a filter method.

It seems you meant to use filter on the array, instead of map:

output = chartsArray = chartsArray.filter(function code(o) {
    if (!el.includes(o.code)) {
        if (o.children) {
            o.children = o.children.filter(code);
        }
        return true;
    }
});
Sign up to request clarification or add additional context in comments.

Comments

0

You may use recursion to filter recursively:

const filter = [
  "Q035001",
  "PCT_EDU_ATTAINMENT"
];

function filterBy(arr, filter){
  return arr.filter( obj => {
    obj.children = filterBy(obj.children, filter);
    return !filter.includes(obj code);
  });
}

const output =  filterBy(chartsArray, filter);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.