Повторять completion
- это плохой знак - смешивать данные и общую реализацию и так далее. Подумайте над тем, чтобы придать вашим объектам тип (назовите его тем, что он на самом деле представляет, например Course
, а не Thing
):
class Thing {
constructor(data) {
this.title = data.title;
this.subtitle = data.subtitle;
this.lessonCount = data.lessonCount;
this.lessons = data.lessons;
}
getCompletion() {
let completedLessons = this.lessons.filter(lesson => lesson.completed).length;
let totalLessons = this.lessons.length;
return (completedLessons / totalLessons) * 100;
}
}
export default [
{
title: "Title 1",
subtitle: "Subtitle 1",
lessonCount: 4,
lessons: [
{
title: "Lesson Name 1",
completed: true
},
{
title: "Lesson Name 2",
completed: true
},
{
title: "Lesson Name 3",
completed: false
},
{
title: "Lesson Name 4",
completed: false
},
],
},
{
title: "Title 2",
subtitle: "Subtitle 2",
lessonCount: 3,
lessons: [
{
title: "Lesson Name 5",
completed: true
},
{
title: "Lesson Name 6",
completed: true
},
{
title: "Lesson Name 7",
completed: true
},
],
},
].map(data => new Thing(data));
Затем вы используете его с fill={cat.getCompletion()}
. Поскольку это функция, ее нужно вызывать.
(Кроме того, вам действительно нужно lessonCount
, учитывая, что она выглядит как lessons.length
?)
Другой вариант, который имеет смыслне требующий, чтобы эта функция была методом:
let getCompletion = ({lessons}) => {
let completedLessons = lessons.filter(lesson => lesson.completed).length;
let totalLessons = lessons.length;
return (completedLessons / totalLessons) * 100;
};
<AnimatedCircularProgress
size={50}
width={5}
rotation={0}
fill={getCompletion(cat)}
tintColor={Colors.primary}
backgroundColor="#dddddd"
/>