#javascript #arrays
#javascript #массивы
Вопрос:
У меня есть эти данные
var data = [
{
title: "App development summary",
category: [],
},
{
title: "to experiment 2",
category: [],
},
{
title: "Some of these books I have read",
category: [
{
_id: "5f7c99faab20d14196f2062e",
name: "books",
},
{
_id: "5f7c99faab20d14196f2062f",
name: "to read",
},
],
},
{
title: "Quora users and snippets",
category: [
{
_id: "5f7c99feab20d14196f20631",
name: "quora",
},
],
},
{
title: "Politics to research",
category: [
{
_id: "5f7c9a02ab20d14196f20633",
name: "politics",
},
],
},
];
Допустим, я хочу получить все записи с категорией books
. Я пытался сделать это:
var bookCat = data.map(note => {
return note.category.map(cat => {
if(cat.name === "books" ) return note
})
})
Но результат возвращается с некоторыми пустыми и неопределенными массивами.
Я смог отфильтровать пустые массивы (в какой-то момент), но не неопределенные
Редактировать
На простом английском языке «если объект ha category.name «книги», дайте мне название».
Комментарии:
1. Вы хотите
name: "to read",
, чтобы объект был включен?2. @CertainPerformance да, это часть категорий. Я пытаюсь получить книгу с категорией «книга» тот факт, что она также имеет категорию «для чтения», не имеет значения.
3. Пожалуйста, покажите пример результатов, которые вы ожидаете получить
4. @Phil результатом вышеизложенного будет
data[2]
то, что это единственный объект с категориейbook
. Я неправильно истолковал данный ответ. код действительно работает, но не зацикливается. Если бы существовал другой объект, подобныйdata[2]
коду, указанному в первом ответе, не отображал бы его. это jsbin.com/popibedugu/edit?js , консоль выбирает правильный вариант, но не учитывает другой
Ответ №1:
Фильтровать по category
тому, содержит ли массив хотя бы один name
, который books
:
var data=[{title:"App development summary",category:[]},{title:"to experiment 2",category:[]},{title:"Some of these books I have read",category:[{_id:"5f7c99faab20d14196f2062e",name:"books"},{_id:"5f7c99faab20d14196f2062f",name:"to read"}]},{title:"Quora users and snippets",category:[{_id:"5f7c99feab20d14196f20631",name:"quora"}]},{title:"Politics to research",category:[{_id:"5f7c9a02ab20d14196f20633",name:"politics"}]}];
const output = data
.filter(item => item.category.some(
({ name }) => name === 'books'
));
console.log(output);
Если гарантированно будет только один соответствующий объект, используйте .find
вместо:
var data=[{title:"App development summary",category:[]},{title:"to experiment 2",category:[]},{title:"Some of these books I have read",category:[{_id:"5f7c99faab20d14196f2062e",name:"books"},{_id:"5f7c99faab20d14196f2062f",name:"to read"}]},{title:"Quora users and snippets",category:[{_id:"5f7c99feab20d14196f20631",name:"quora"}]},{title:"Politics to research",category:[{_id:"5f7c9a02ab20d14196f20633",name:"politics"}]}];
const output = data
.find(item => item.category.some(
({ name }) => name === 'books'
));
console.log(output);
Комментарии:
1. Это не то, чего я хочу. Я хочу, чтобы весь родительский элемент категории
2. На простом английском языке «если объект ha category.name «книги», дайте мне название». Вот с чем у меня возникли проблемы: получение родительского массива в тот момент, когда я отфильтровал название категории.
3. Еще раз извините, что, если есть два объекта с категорией «книги». jsbin.com/popibedugu/edit?js , консоль я добавил еще одну запись и не показывает
4. @relidon Похоже, это работает? Он показывает результирующий массив длиной 2 — оба объекта с
books
включенным get