Фильтр Javascript не работает с несколькими условиями - PullRequest
0 голосов
/ 28 апреля 2018

Предположим, у меня есть этот массив:

array = [{ 
    name: 'my post',
    categories: [{
        slug: 'a-cat',
        name: 'A Category'
    }
},
{ 
    name: 'my other post',
    categories: [{
        slug: 'another-category',
        name: 'Another Category'
    },
    {
        slug: 'a-cat',
        name: 'A Category'
    }
},
]  

Теперь я хотел бы отфильтровать его, чтобы получить все элементы, которые содержат категорию another-category, это то, что я пробовал до сих пор, но ничего не заканчивается в filteredArray

let filteredArray = array.filter(function (item) {
    return item.categories.forEach(function(cat) {
        return cat.slug === 'another-category'
    })
})

Есть мысли о том, что я сделал неправильно?

const array = [{
    name: 'my post',
    categories: [{
      slug: 'a-cat',
      name: 'A Category'
    }]
  },
  {
    name: 'my other post',
    categories: [{
        slug: 'another-category',
        name: 'Another Category'
      },
      {
        slug: 'a-cat',
        name: 'A Category'
      }
    ]
  },
]


let filteredArray = array.filter(function(item) {
  return item.categories.forEach(function(cat) {
    return cat.slug === 'another-category'
  })
})

console.log(filteredArray)

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Кажется, вы неправильно поняли возвращаемое значение forEach. В вашем примере кода item.category.forEach() всегда будет возвращать undefined, когда завершит выполнение, поэтому оно пошло не так.

В этом случае вы должны использовать Array.some(), который с возвращаемым значением является логическим (true / false).

let filteredArray = array.filter(function (item) {
    // this mean:
    //  if has ANY <cat>s in array item.categories has slug attribute equal 'another-category': 
    //  return current <item>
    return item.categories.some(function(cat) {
        return cat.slug === 'another-category'
    })
})

** Альтернативный ответ использует .every():

let filteredArray = array.filter(function (item) {
        // this mean:
        //  if NOT(ALL <cat>s in array item.categories haven't .slug attribute  equal  'another-category'): 
        //  return current <item>
        return !item.categories.every(function(cat) {
            return (return cat.slug !== 'another-category')
        });
})

примечание: .every() - это просто дополнительный пример, если вам, ребята, это понадобится в будущем :)!

0 голосов
/ 28 апреля 2018

Вы можете использовать метод find над categories для фильтрации окончательного списка

let filteredArray = array.filter(item => {
    return item.categories.find( category => category.slug === 'another-category');
});
0 голосов
/ 28 апреля 2018

Что вам нужно здесь, это some. Заменить forEach на some.

return item.categories.some(function(cat) {
    return cat.slug === 'another-category'
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...