Я пытаюсь отфильтровать объект данных Wordpress JSON (в моем примере объект называется "post") с использованием VueJS2 и Wordpress REST API (у меня есть пользовательский тип сообщения в моем примере с реальным миром).
Я могу успешно фильтровать через свойство title post post, но мне было интересно узнать, возможно ли, чтобы в поисковом запросе был фильтр по умолчанию, а не только по свойству post.title, потому что там термин поиска может содержать ключевые слова, найденные в другом месте объект, а не только заголовок.
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;
});
}
});
Кто-нибудь знает, как написать код, чтобы запрос мог искать весь объект? Спасибо.
Эти объекты действительно обширны. Я не уверен, что вы захотите найти все.
Это может быть наивный способ сделать это.
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)
})
});
Но это будет искать только прямые свойства сообщения, а не суб объекты.
Я думаю, вы хотите сузить область видимости.