Пустой массив при фильтрации внутри глубокого объекта

#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);