Предполагая, что каждый объект не имеет глубоко вложенных объектов или массивов внутри, вы можете использовать Object.values
, чтобы получить значения вашего объекта.
С вашими текущими данными возвращаемые значения будут содержать другой массив, поэтому вы должны сгладить его, используя .concat.apply
, чтобы объединить значения в один массив.
Использованиезатем вы можете легко проверить, содержит ли текущий объект ваш searchItem
.
Редактировать: Если вы хотите включить в результат элемент, если searchItem
соответствует определенномучасти значений элементов, вы можете использовать .join
, чтобы объединить ваши сведенные значения в строку.
См. пример ниже:
var app = new Vue({
el: '#app',
data: {
result: [],
searchItem: '',
entries: [{
"a": "something",
"id": 54785,
"b": ["one", "two", "three"]
},
{
"a": "nothing",
"id": 54785,
"b": ["each", "every", "one"]
},
{
"a": "everything",
"id": 54785,
"b": ["each", "every", "one"]
},
]
},
methods: {
searchObject: function() {
this.result = []; // clear data, for demonstration only, remove if not needed
for (var i = 0; i < this.entries.length; i++) {
var values = [].concat.apply([], this.getValues(this.entries[i]));
// you can also convert it to a string to match certain string parts
values = values.join(',');
if (values.indexOf(this.searchItem) !== -1) {
this.result.push(this.entries[i])
}
}
},
getValues: function(object) {
// use a polyfill in case Object.values is not supported by current browser
return Object.values ? Object.values(object) : Object.keys(object).map(key => object[key]);
}
}
})
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<div id="app">
<input type="text" v-model="searchItem" v-on:input="searchObject" placeholder="Search here" />
<ul>
<li v-for="i in result">{{i}}</li>
</ul>
</div>