Как отфильтровать весь объект JSON?

1

Я пытаюсь отфильтровать объект данных Wordpress JSON (в моем примере объект называется "post") с использованием VueJS2 и Wordpress REST API (у меня есть пользовательский тип сообщения в моем примере с реальным миром).

Я могу успешно фильтровать через свойство title post post, но мне было интересно узнать, возможно ли, чтобы в поисковом запросе был фильтр по умолчанию, а не только по свойству post.title, потому что там термин поиска может содержать ключевые слова, найденные в другом месте объект, а не только заголовок.

JSFIDDLE здесь

HTML:

<div id="app" class="container" style="padding-top: 2em;">      
  <input v-model="searchText">

  <table class="table table-striped" v-if="posts">
    <thead>
      <tr>
        <th>Title</th>
        <th>Product Type</th>
      </tr>
    </thead>
    <tr v-for="post in itemsSearched">
      <td>{{post.title.rendered}}</td>
      <td>{{post._embedded["wp:term"][1]["0"].name}}</td>
    </tr>
  </table>
</div>

JS:

var vm = new Vue({
  el: '#app',
  data: {
    message: 'hello world',
    searchText: '',
    posts: []
  },
  computed : {
    itemsSearched : function(){
      var self = this;
      if( this.searchText == ''){
        return this.posts;
      } 
      return this.posts.filter(function(post){
        return post.title.rendered.indexOf(self.searchText) >= 0;
      });
    }
  },
  created: function(){
    $.get('https://wordpress-dosstx.c9users.io/wp-json/wp/v2/products/' + '?_embed=true')
      .done(function(data) {
        vm.posts = data;
      });
  }
});

Кто-нибудь знает, как написать код, чтобы запрос мог искать весь объект? Спасибо.

Теги:
vuejs2
wordpress-rest-api

1 ответ

1
Лучший ответ

Эти объекты действительно обширны. Я не уверен, что вы захотите найти все.

Это может быть наивный способ сделать это.

return this.posts.filter(function(post){
  return JSON.stringify(post).includes(self.searchText)
});

Тем не менее, это вернет текст, который соответствует ключам, но он будет искать и все вспомогательные объекты.

Другой возможный способ сделать это - искать только те свойства объектов, которые являются строками.

return this.posts.filter(function(post){
  return Object.keys(post).some(k => {
    return typeof(post[k]) === "string" && post[k].includes(self.searchText)
  })
});

Но это будет искать только прямые свойства сообщения, а не суб объекты.

Я думаю, вы хотите сузить область видимости.

  • 0
    Спасибо. Я думаю, что сужение моей области более жизнеспособно!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню