Фильтрация массива вложенных массивов с использованием объекта conition в Typescript - PullRequest
0 голосов
/ 10 ноября 2018

У меня есть массив объектов (в формате Json), как показано ниже

var datas = [
  {
    "Id": "1",
    // Here 10 fields
    "tests": [
            {
                "id":"1-1",
                "isSelected": true,
            },
            {
                "id":"1-2",
                "isSelected": false,
            },
        ]
  },
  {
    "Id": "2",
    // Here 10 fields
    "tests": [
            {
                "id":"2-1",
                "isSelected": true,
            },
            {
                "id":"2-2",
                "isSelected": true,
            },
        ]
  },
  {
    "Id": "3",
    // Here 10 fields
    "tests": [
            {
                "id":"3-1",
                "isSelected": false,
            },
            {
                "id":"3-2",
                "isSelected": false,
            },
        ]
  }
]

И я попробовал, как показано ниже

var filteredData = datas.filter( t => t.tests.filter(o => o.isSelected));

для получения всех данных с тестами из "isSelected" значение равно true, и оно не работает. Есть ли в любом случае, чтобы получить данные в формате ниже.

[
  {
    "Id": "1",
    // Here 10 fields
    "t": [
            {
                "id":"1-1",
                "isSelected": true,
            }
        ]
  },
  {
    "Id": "2",
    // Here 10 fields
    "tests": [
            {
                "id":"2-1",
                "isSelected": true,
            },
            {
                "id":"2-2",
                "isSelected": true,
            },
        ]
  }
]

1 Ответ

0 голосов
/ 10 ноября 2018

Вы на правильном пути, но вы возвращаете внутренний filter результат (массив) из вашего внешнего filter обратного вызова. Массив правдив, поэтому вы храните все.

Вам нужно обработать каждый внешний объект в два этапа:

  1. Фильтрация его tests и

  2. Полная фильтрация, если tests пусто

Итак:

var filteredData = datas.filter(t => {
  t.tests = t.tests.filter(o => o.isSelected);
  return t.tests.length !== 0;
});

var datas = [
  {
    "Id": "1",
    // Here 10 fields
    "tests": [
            {
                "id":"1-1",
                "isSelected": true,
            },
            {
                "id":"1-2",
                "isSelected": false,
            },
        ]
  },
  {
    "Id": "2",
    // Here 10 fields
    "tests": [
            {
                "id":"2-1",
                "isSelected": true,
            },
            {
                "id":"2-2",
                "isSelected": true,
            },
        ]
  },
  {
    "Id": "3",
    // Here 10 fields
    "tests": [
            {
                "id":"3-1",
                "isSelected": false,
            },
            {
                "id":"3-2",
                "isSelected": false,
            },
        ]
  }
]

var filteredData = datas.filter(t => {
  t.tests = t.tests.filter(o => o.isSelected);
  return t.tests.length !== 0;
});

console.log(filteredData);
.as-console-wrapper {
  max-height: 100% !important;
}

Или, если вам действительно нужна краткая функция стрелки:

Итак:

var filteredData = datas.filter(t =>
  (t.tests = t.tests.filter(o => o.isSelected)).length !== 0
);

var datas = [
  {
    "Id": "1",
    // Here 10 fields
    "tests": [
            {
                "id":"1-1",
                "isSelected": true,
            },
            {
                "id":"1-2",
                "isSelected": false,
            },
        ]
  },
  {
    "Id": "2",
    // Here 10 fields
    "tests": [
            {
                "id":"2-1",
                "isSelected": true,
            },
            {
                "id":"2-2",
                "isSelected": true,
            },
        ]
  },
  {
    "Id": "3",
    // Here 10 fields
    "tests": [
            {
                "id":"3-1",
                "isSelected": false,
            },
            {
                "id":"3-2",
                "isSelected": false,
            },
        ]
  }
]

var filteredData = datas.filter(t =>
  (t.tests = t.tests.filter(o => o.isSelected)).length !== 0
);

console.log(filteredData);
.as-console-wrapper {
  max-height: 100% !important;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...