data는 Date() 정보를 가지고 있습니다.
이 data들을 주별, 월별로 나눠서 차트, 표에 나오도록 하고 싶습니다.
같은달, 같은 weekofYear끼리 데이터들을 더하고 그 값들을 리스트에 넣어서 차트의 자료로 넣고 싶은데
어떻게 해야할지 잘 모르겠습니다.
데이터 형식 입니다.
week는 지금은 이상태인데 그러면 이번주를 기준으로 5주까지의 데이터들이 다 나와있습니다.
month는 1년치의 모든 데이터입니다.
map 이후로 막히시는 걸로 보이는데, 맞는지 모르겠네요~
제 생각으로는 $0에는 pushData가 들어오고 pushData가 맨위의 코드처럼 초기화가 된다면,
$0.distance 혹은 $0.duration으로 접근이 가능하실 것 같아요~
근데 map은 filter된 배열을 다른 배열로 바꾸는 역할을 하기 때문에 사실 뭔가를 더하고 싶다면 적절한 연산자는 아닌 것 같구요. (물론 불가능하지는 않습니다…) reduce를 고려해보시면 좋을 것 같습니다. 제가 위에 전제한 상황이 아니더라도 현재 배열에 있는 값들을 수렴하고 싶으시다면 reduce가 키가 될 것 같습니다:)
네 reduce를 사용해봤는데 reduce와 조건문을 어떻게 같이 써야할지 모르겠습니다…
같은 월끼리, 같은 주끼리 묶어서 합쳐야하는데 그부분을 어떻게 하면 좋을까요…?
그러시다면 필터링에서 해당 년도의 주를 비교하시면 될 것 같은데요~
글로 설명드리니깐 뭔가 어렵네요 ㅎㅎ;
func ordiDate(date: Date) → Int? {
return Calendar.current.ordinality(of: .weekOfYear, in: .year, for: date)
}
guard let week = ordiDate(date: Date()) else { return false }
if week == 23 {
return true
}
// 1년은 52주고 차피 같은 해 안에서는 고유한 번호니 index처럼 사용하시고, 저는 임시로 23주로 했지만 원하시는 주를 위의 함수로 만들어서 비교해주시면 될 것 같습니다:) 그럼 원하는 주의 배열이 나오게 되고 그걸 reduce로 더하시면 될 듯합니다. 주가 아니라 월이라면 위의 함수에서 .monthOfYear로 바꾸시면 되지 않을까요?
다른 주를 추가하신다거나 여러 월을 보여주는 건 결국 각각 다른 배열을 필요로 하는거니 pushData의 구조를 바꾸거나 아니면 일일이 배열을 만들어주거나 하는 방식으로 해야 될 것 같습니다~
reduce로 해결했습니다! 감사합니다!!
해결한 코드도 여기 올려주시면 글을 읽는 분들에게 도움이 될 듯 합니다.