Фильтр внутри фильтра работает в одном случае, а в другом - нет. - PullRequest
0 голосов
/ 27 мая 2020

Итак, я обнаружил go в этих двух сообщениях:

  1. ES6 .filter внутри .filter

    [ { "id": 0, "title": "happy dayys", "owner": {"id": "1", "username": "dillonraphael"}, "tags": [{"value": "Art", "label": "Art"}], "items": [] }, { "id": 1, "title": "happy dayys", "owner": {"id": "1", "username": "dillonraphael"}, "tags": [{"value": "Architecture", "label": "Architecture"}], "items": [] }, ]

В этом OP попытался отфильтровать данные, используя вложенный фильтр, который не работал:

const tagMoodboards = _moodboards.filter(mb => { return mb.tags.filter(t => t.value == name) });

Причина в том, что внутренний filter возвращает array (правда), поэтому для внешнего массива он становится таким _moodboards.filter(mb => true), поэтому он печатает весь массив

Тогда есть аналогичная проблема

Как отфильтровать вложенный массив в javascript

, где есть такие данные:

{
  "list": [
    {
      "deviceId": "2a-d539-4031-9bfc-4a42f2f765cf",
      "versions": [
        {
          "id": "764c20-a213-9235f4b553b3",
          "createdTime": 1590361208034,
          "files": [
            {
              "fileType": "VLAN"
            },
            {
              "fileType": "STARTUPCONFIG",
            }
          ],
          "startupRunningStatus": "OUT_OF_SYNC",
          "createdBy": "SCHEDULED"
        },
        {
          "id": "9bd33-a45a-ed2fefc46931",
          "createdTime": 1589972337717,
          "files": [
            {
              "fileType": "VLAN",
            },
            {
              "fileType": "STARTUPCONFIG",
            },
            {
              "fileType": "RUNNINGCONFIG",
            }
          ],
          "startupRunningStatus": "IN_SYNC",
          "createdBy": "SCHEDULED_FIRST_TIME"
        }
      ]
    }
  ]
}

и OP хотел отфильтровать данные, таким образом, что он должен возвращать только тот массив, где присутствует "fileType": "RUNNINGCONFIG" и "fileType": "STARTUPCONFIG"

Но в этом случае filter внутри filter кажется выполнить работу

let versionsData = obj.list[0].versions; versionsData = versionsData.filter( versions => { return versions.files.filter( m => { return m.fileType === "RUNNINGCONFIG" || m.fileType === "STARTUPCONFIG" }).length > 1 } ); console.log(versionsData);

Во втором случае я чувствовал, что он должен был следовать тому же шаблону versionData = versionData.filter(versions => true), следовательно, возвращать весь массив.

Итак, мой вопрос в том, что именно мне здесь не хватает? Где я ошибаюсь?

1 Ответ

0 голосов
/ 27 мая 2020

Вы должны изменить его на:

const tagMoodboards = _moodboards.filter(mb => { return mb.tags.filter(t => t.value == name).length });

Для Рахула: Вставьте этот код в консоль браузера:

let arr = [
    {
    "id": 0,
    "title": "happy dayys",
    "owner": {"id": "1", "username": "dillonraphael"},
    "tags": [{"value": "Art", "label": "Art"}],
    "items": []
    },
    {
    "id": 1,
    "title": "happy dayys",
    "owner": {"id": "1", "username": "dillonraphael"},
    "tags": [{"value": "Architecture", "label": "Architecture"}],
    "items": []
    },
];

console.info(arr.filter(mb => { return mb.tags.filter(t => t.value == 'Art') })); // -> 2 hits (=wrong)
console.info(arr.filter(mb => { return mb.tags.filter(t => t.value == 'Art').length })); // -> 1 hit (=right)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...