Фильтровать вложенный массив на основе его вложенных значений - PullRequest
0 голосов
/ 09 октября 2018

Если бы у меня были следующие данные, как бы я отфильтровал массив students в каждом node с использованием синтаксиса ES6, чтобы он возвращал только тех учеников, которые имеют определенное значение в subjects (например, subject = 'Английский ')?

Данные:

[
  {
    "node": {
      "name": "Miss Jones",
      "students": [
        {
          "name": "John",
          "subjects": ["English", "Maths"]
        },
        {
          "name": "Sarah",
          "subjects": ["Geography"]
        }
      ]
    }
  },
  {
    "node": {
      "name": "Mr Hudson",
      "students": [
        {
          "name": "Joe",
          "subjects": ["Maths", "French"]
        },
        {
          "name": "Samantha",
          "subjects": ["English"]
        }
      ]
    }
  }
]

Ожидаемый результат:

[
  {
    "node": {
      "name": "Miss Jones",
      "students": [
        {
          "name": "John",
          "subjects": ["English", "Maths"]
        }
      ]
    }
  },
  {
    "node": {
      "name": "Mr Hudson",
      "students": [
        {
          "name": "Samantha",
          "subjects": ["English"]
        }
      ]
    }
  }
]

Спасибо!

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Вам не нужна функция map, как предлагают другие ответы, даже когда обработчик изменяет исходный массив.

Просто используйте функцию forEach для зацикливания и функцию filterвместе с функцией includes для проверки массива subjects.

const arr = [  {    "node": {      "name": "Miss Jones",      "students": [        {          "name": "John",          "subjects": ["English", "Maths"]        },        {          "name": "Sarah",          "subjects": ["Geography"]        }      ]    }  },  {    "node": {      "name": "Mr Hudson",      "students": [        {          "name": "Joe",          "subjects": ["Maths", "French"]        },        {          "name": "Samantha",          "subjects": ["English"]        }      ]    }  }],
      subject = 'English';
  
arr.forEach(o => o.node.students = o.node.students.filter(s => s.subjects.includes(subject)));

console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 09 октября 2018

Я бы отфильтровал данные, используя .map и .filter.

const data = [{ "node": { "name": "Miss Jones", "students": [{ "name": "John", "subjects": ["English", "Maths"] }, { "name": "Sarah", "subjects": ["Geography"] }] } }, { "node": { "name": "Mr Hudson", "students": [{ "name": "Joe", "subjects": ["Maths", "French"] }, { "name": "Samantha", "subjects": ["English"] }] } }];

const results = data.map(({ node }) => {
    const students = node.students.filter(student =>
        student.subjects.includes('English'));
    return {
        node: {
            ...node,
            students
        }
    };
});

console.log(results);
0 голосов
/ 09 октября 2018

То, что вы пытаетесь сделать, это преобразовывать данные, а не только фильтровать.Пожалуйста, попробуйте следующее:

data.map((o) => {
  o.students = o.node.students.filter((s) => s.subjects.indexOf("English") >= 0);
  if (o.students.length >= 0) return o;
  return null;
}).filter((o) => o);

Вы должны вернуть ноль для студентов, у которых нет предмета English, а затем отфильтровать ноль, чтобы игнорировать их

0 голосов
/ 09 октября 2018

Да, вы можете сделать это с map и filter.

let nodes = [
  {
    "node": {
      "name": "Miss Jones",
      "students": [
        {
          "name": "John",
          "subjects": ["English", "Maths"]
        },
        {
          "name": "Sarah",
          "subjects": ["Geography"]
        }
      ]
    }
  },
  {
    "node": {
      "name": "Mr Hudson",
      "students": [
        {
          "name": "Joe",
          "subjects": ["Maths", "French"]
        },
        {
          "name": "Samantha",
          "subjects": ["English"]
        }
      ]
    }
  }
];

const englishNodes = nodes.map(n => {
  n.node.students = n.node.students.filter(s => s.subjects.includes('English'));
  return n;
});

console.log(englishNodes);
...