У меня есть массив, который выглядит примерно так
var categorizedBooks = [
{
name: "category1",
books:[
{name:"book1", bookContainerId: 1, active: true},
{name:"book2", bookContainerId: 2, active: false},
{name:"book3", bookContainerId: 2, active: true},
]
},
{
name: "category2",
books:[
{name:"book4", bookContainerId: 1, active: false},
{name:"book5", bookContainerId: 3, active: true},
{name:"book6", bookContainerId: 4, active: true},
]
},
{
name: "category3",
books:[
{name:"book7", bookContainerId: 1, active: false},
{name:"book8", bookContainerId: 2, active: true},
{name:"book9", bookContainerId: 4, active: false},
]
},
{
name: "category4",
books:[
{name:"book10", bookContainerId: 2, active: false},
{name:"book11", bookContainerId: 2, active: false},
{name:"book12", bookContainerId: 4, active: false},
]
}
И я хочу отфильтровать их по двум массивам, которые выглядят примерно так:
bookContainers: [1,3]
isActive: ['active', 'inactive] // an array of strings
Они поступают из входов такэто может измениться когда угодно. Поэтому я хочу сопоставить bookContainers с их bookContainerId, а строковый массив 'active' / 'неактивен' с их логическим активным свойством, и если объект в массиве booksBooks категории пуст, я хочу удалить его.
Так что вв этом случае я получу что-то вроде этого (Требуемый вывод из вышеприведенного):
{
name: "category1",
books:[
{name:"book1", bookContainerId: 1, active: true}
]
},
{
name: "category2",
books:[
{name:"book4", bookContainerId: 1, active: false},
{name:"book5", bookContainerId: 3, active: true}
]
},
{
name: "category3",
books:[
{name:"book7", bookContainerId: 1, active: false}
]
}
Другая проблема заключается в том, что я не хочу изменять исходный массив, потому что я хочу иметь возможность вызывать его с новыммассивы для фильтрации всякий раз, и получить результат. Вот мой метод GET сейчас:
public get bookCategories(): Array<CategorizedBook> {
let cloneToMapOf = [...this.categoriesAndBooks];
const filteredCategories = cloneToMapOf.map(categorizedbooks => {
categorizedbooks.books = categorizedbooks.properties.filter(book =>{
return (rc.includes(books.bookContainerId) &&
sa.includes(book.active ? 'active' : 'inactive'));
});
return categorizedbooks;
});
const result = filteredCategories.filter(x => x.books.length > 0 && x.books != null);
return result;
}
Но по какой-то причине этот код модифицирует this.categoriesAndBooks, так что через некоторое время я становлюсь пустым ..
с результатом, который я хочу представить в некотором HTML
<nz-collapse [nzBordered]="false" *ngFor="let categorizedBook of bookCategories;">
<nz-collapse-panel [nzHeader]="categorizedBook.name" [nzActive]="true">
<ng-container *ngFor="let book of categorizedBook.properties; trackBy:trackBy.book">
<ng-template [ngTemplateOutlet]="bookEditors" [ngTemplateOutletContext]="{book: book, form: bookValueForm}"></ng-template>
</ng-container>
</nz-collapse-panel>
</nz-collapse>
Я сижу с этим часами .. пожалуйста, помогите мне