Фильтровать массив объектов внутри другого массива в JS - PullRequest
0 голосов
/ 17 января 2019

Javascript. Имеют такую ​​структуру, массив объектов, которые имеют массив items внутри каждого

[
  {
    "title": "Venom",
    "items": [
      {
        "title": "Venom title",
        "active": true
      },
      {
        "title": "Venom2",
        "active": false
      }
    ]
  },
  {
    "title": "Video",
    "items": []
  },
  {
    "title": "Button",
    "items": [
      {
        "title": "Button page",
        "active": true
      }
    ]
  }
]

Я хочу исключить items со свойством active: false внутри каждого элемента, поэтому исключите элемент Venom2

{
   "title": "Venom2",
   "action": "venom2",
   "content": "qwertrete5t5t4t5",
   "active": false
}

из существующего массива.

Я делаю это с помощью forEach и накапливаю массив внутри другого, вот он

let menu = [];

v.forEach((section) => {
     menu.push({
         title: section.title,
         items: section.items.filter(item => item.active)
     })
});

Затем я попытался сделать его более красивым с двойным фильтром, но он не работает, он возвращает [], и я в основном догадываюсь, почему ...

let menu = v.filter((section) => {
    return (section.items.filter(item => item.active === true));
});

Возможно, есть более красивое (может быть, с уменьшением) решение моего дела?

1 Ответ

0 голосов
/ 17 января 2019

Ваш forEach должен работать нормально. Единственное улучшение, которое я вижу, это использование map и деструктурирование . Таким образом, вы можете напрямую присвоить его menu следующим образом:

const v = [{title:"Venom",items:[{title:"Venom title",active:true},{title:"Venom2",active:false}]},{title:"Video",items:[]},{title:"Button",items:[{title:"Button page",active:true}]}];

let menu = v.map(({title, items}) => ({title, items: items.filter(i => i.active)}))
console.log(menu)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...