#javascript
#javascript
Вопрос:
Я создал эту функцию для глубокой фильтрации массива объектов, но в конце результат пустой. Если я проверю с помощью консоли.войдите в оператор if, он покажет мне отфильтрованный объект, но resultPost вернет мне пустое значение. Я также пытался вставить в пустой массив отфильтрованное значение, но не сработало.
const post = [{
"name": "new post",
"description": "simple desc",
"taxonomies": {
"categories": {
"0": {
"term_id": 15
},
"1": {
"term_id": 20
},
}
}
},
{
"name": "new post 2",
"description": "simple desc 2",
"taxonomies": {
"categories": {
"0": {
"term_id": 11
},
"1": {
"term_id": 12
},
}
}
}
];
const filterID = [15, 1];
const resultPost = post.filter(post => {
if ((post.taxonomies.categories.filter(postct => postct.term_id === filterID)).length > 0) return post
});
console.log(resultPost);
Комментарии:
1.
taxonomies.categories
это объект, который вы не можете применитьfilter
к объекту.2. Я превратил ваш код в фрагмент кода. Когда вы запускаете его, он выдает ожидаемую ошибку
filter
(как объяснил горак). Так что это не так, как вы описываете в своем вопросе.3. каков ваш желаемый результат?
4. Да, вы правы, мне нужна отфильтрованная запись по идентификатору (весь объект), если категории соответствуют фильтру. Спасибо
Ответ №1:
Вы можете фильтровать сообщения, сопоставляя taxonomies.categories[id].term_id
следующим образом:
const post = [{
"name": "new post",
"description": "simple desc",
"taxonomies": {
"categories" : {
"0" : {
"term_id" : 15
},
"1" : {
"term_id" : 20
},
}
}
},
{
"name": "new post 2",
"description": "simple desc 2",
"taxonomies": {
"categories" : {
"0" : {
"term_id" : 11
},
"1" : {
"term_id" : 12
},
}
}
}];
const filterID = [15,1];
const resultPost = post.filter(item => {
const { categories } = item.taxonomies;
return Object.keys(categories).reduce((cats, id) => {
filterID.includes(categories[id].term_id) amp;amp; cats.push(id);
return cats;
}, []).length
});
console.log( resultPost)
Ответ №2:
Как сказано в комментариях, вы не можете использовать filter для объекта. Попробуйте это вместо
const resultPost = post.filter(post => {
for (let cat in post.taxonomies.categories) { // one way to loop over objects
// filterId is an array so you can't just use ===
if (filterID.includes(post.taxonomies.categories[cat].term_id)) return true;
}
return false;
});
Ответ №3:
Внутри фильтра вы можете взять Object.values
этот объект, а затем использовать some
его в зависимости от вашего состояния для фильтрации записей. Что-то вроде этого:
const post = [{ "name": "new post", "description": "simple desc", "taxonomies": { "categories": { "0": { "term_id": 15 }, "1": { "term_id": 20 }, } } }, { "name": "new post 2", "description": "simple desc 2", "taxonomies": { "categories": { "0": { "term_id": 11 }, "1": { "term_id": 12 }, } } }];
const filterID = [15,1];
const result = post.filter(p=>Object.values(p.taxonomies.categories).some(n=>filterID.includes(n.term_id)));
console.log(result);