У меня есть объект как таковой:
export var PROJECT: any = {
id: "1",
name: "Hunkemoller",
teammembers: [
{
id: 1,
name: "Sarah Johnson",
firstname: "Sarah",
role: "Manager"
},
{
id: 2,
name: "Christian Johnson",
firstname: "Christian",
role: "Employee"
}
и т.п.
Я создаю приложение, и я хочу добавить в него элемент поиска, чтобы вы могли искать разных членов команды. Я хочу инициализировать все имена свойств "из каждого члена команды". Это единственное, что нужно фильтровать.
Я подумал о двух способах:
Можете ли вы помочь мне сделать правильный выбор и объяснить мне, как я могу добиться успеха? Я даже не знаю, как сделать новый массив из существующего. Я думал примерно так:
var teamMembers = project.teammembers.name();
Но, кроме этого, было бы лучше, если бы я мог просто использовать свойство name из объекта.
Я был так далеко (я использую Ionic 2/Angular 2)
<ion-searchbar (ionInput)="getTeammembers($event)" [(ngModel)]="searchQuery"></ion-searchbar>
<ion-list>
<ion-item *ngFor="let teammember of project.teammembers">
{{ teammember.name }}
</ion-item>
</ion-list>
В моем файле машинописного текста у меня есть следующее:
initializeTeammembers() {
this.project.teammembers;
}
getTeammembers(ev) {
// reset teammembers back to all of the teammembers
this.initializeTeammembers();
// set val to the value of the searcbar
let val = ev.target.value;
// if the value is empty string, don't filter teammembers
if (val && val.trim() != '') {
this.project.teammembers.name = this.project.teammembers.name.filter((teammember) => {
return (teammember.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
}
Но это не сработает. Я получаю сообщение об ошибке: Не могу прочитать свойство 'filter' undefined.
Может кто-нибудь, кто угодил бы мне помочь? Заранее спасибо.
Вы можете создать новый массив, используя Array.prototype.map:
var teamMembers = project.teammembers.map(function(item){ return item.name });
var project = {
id: "1",
name: "Hunkemoller",
teammembers: [
{
id: 1,
name: "Sarah Johnson",
firstname: "Sarah",
role: "Manager"
},
{
id: 2,
name: "Christian Johnson",
firstname: "Christian",
role: "Employee"
}
]
};
console.log(project.teammembers.map(function(item){ return item.name }));
Лучший способ - создать канал, который будет фильтровать ваши результаты с помощью Array.prototype.filter.
Это не должно быть this.project.teammembers.name
и должно быть просто this.project.teammembers
а затем использовать teammebers.name
в результирующем фильтре
if (val && val.trim() != '') {
this.project.teammembers.name =
this.project.teammembers.filter((teammember) => {
return (teammember.name.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
Или вы можете попробовать что-то вроде этого, чтобы отфильтровать имя...
this.project.teammembers.name = this.project.teammembers.filter(function(el) {
return (el.name === val.toLowerCase());
}).map(function(el) {
return el.firstname;
}).sort();
SO в основном вы фильтруете через имя, а затем, если вы хотите, чтобы новый массив с их первыми именами отсортирован по порядку... вы могли бы сделать map
и sort
или используйте знак подчеркивания _.map() http://underscorejs.org/#map
var teamMembers = _.map(project.teammembers, function(item){
return item.name
});
В конце концов мне это удалось. Я начал с самого начала, начиная с жестко закодированного массива, чтобы получить элементы из моего существующего объекта.
Для тех, кто с той же проблемой, это мой последний код:
HTML:
<ion-searchbar (ionInput)="getNames($event)"></ion-searchbar>
<ion-list>
<ion-item *ngFor="let name of names">
{{ name }}
</ion-item>
</ion-list>
Машинопись:
export class Page1 {
names;
}
constructor () {
this.initializeNames();
}
initializeNames() {
this.names = this.project.teammembers.map(function(item){ return item.name }); // Thanks a lot Amir for this !
}
getNames(ev) {
// Reset items back to all of the items
this.initializeNames();
// set val to the value of the searchbar
let val = ev.target.value;
// if the value is an empty string don't filter the items
if (val && val.trim() != '') {
this.names = this.names.filter((item) => {
return (item.toLowerCase().indexOf(val.toLowerCase()) > -1);
})
}
}
Я думаю, что project.teammembers.name было проблемой. Теперь с новой переменной только "имен" она преуспела. Большое спасибо за помощь ребятам!