Я пытаюсь отфильтровать массив объектов javascript по строке. Но я хочу, чтобы фильтр смотрел на каждое свойство и проверял его, чтобы убедиться, что строка действительна. У AngularJS есть встроенный фильтр, который делает это, но я не могу найти для него никаких решений на SO.
[
{
"title":"Mr.",
"name":"John Smith",
"firstName":"John",
"lastName":"Smith"
},
{
"title":"Mr.",
"name":"Bill Smith",
"firstName":"Bill",
"lastName":"SMith"
}
]
Так, например, если я ввел "Jo" для текстовой строки, он вернет объект в индекс 0, что довольно легко сделать, если вы просто хотите выполнить поиск по одному свойству.
Теперь, если я войду в "Mr", он должен вернуть оба элемента в индекс 0 и индекс 1, потому что мы ищем все свойства.
Надеюсь, это имеет смысл в отношении того, что я прошу.
РЕДАКТИРОВАТЬ: Очень жаль было поздно ночью прошлой ночью, и я оставил очень важные детали в структуре данных.
{
"title":"Mr.",
"name":"John Smith",
"firstName":"John",
"lastName":"Smith",
"contactType":{
"name":"test"
},
"addresses":[
{"address":"Test Street One"},
{"address":"Test Street Two"},
]
},
{
"title":"Mr.",
"name":"Bill Smith",
"firstName":"Bill",
"lastName":"SMith",
"contactType":{
"name":"test"
},
"addresses":[
{"address":"Test Street One"},
{"address":"Test Street Two"},
]
}
Таким образом, в этом случае поиск учитывал бы любой тип и любое количество вложенных объектов внутри объектов. Извините, что забыли эту часть.
Вы можете использовать комбинацию Array#filter
и Object.values
для достижения этой цели:
let data = [{
"title": "Mr.",
"name": "John Smith",
"firstName": "John",
"lastName": "Smith"
},
{
"title": "Mr.",
"name": "Bill Smith",
"firstName": "Bill",
"lastName": "SMith"
}
];
let string = 'Jo';
let results = data.filter(item => Object.values(item).some(value => value.includes(string)));
console.log(results);
let results = data.filter(item => Object.values(item).some(value => value.includes(string)));
так как это будет автоматически возвращено.
Вы можете прокручивать объекты массива и использовать indexof для поиска элементов, которые имеют входную строку,
DEMO
var myarray =[
{
"title":"Mr.",
"name":"John Smith",
"firstName":"John",
"lastName":"Smith"
},
{
"title":"Mr.",
"name":"Bill Smith",
"firstName":"Bill",
"lastName":"SMith"
}
];
var toSearch = "Mr";
var results =[];
for(var i=0; i<myarray.length; i++) {
for(key in myarray[i]) {
if(myarray[i][key].indexOf(toSearch)!=-1) {
results.push(myarray[i]);
}
}
}
console.log(results)
Прокрутите все свойства для каждого объекта:
var items = [{
"title": "Mr.",
"name": "John Smith",
"firstName": "John",
"lastName": "Smith"
}, {
"title": "Mr.",
"name": "Bill Smith",
"firstName": "Bill",
"lastName": "SMith"
}];
console.log("Jo :", items.filter(x => contains(x, "Jo")).map(x => x.name));
console.log("Mr :", items.filter(x => contains(x, "Mr")).map(x => x.name));
function contains (x, w) {
for (let k in x) {
if (x[k].indexOf(w) !== -1) {
return true;
}
}
return false;
}