Tl; dr основной проблемы: WeakMap.get()
возвращает undefined
, если на ключевой объект не ссылается variable/let
в глобальной области видимости (область действия компонента Angular в данном случае)
MRE:
let x = new WeakMap()
x.set({month: 1, date: 15, year: 2015}, {month: 1, date: 15, year:2015})
console.log(x.get({month: 1, date: 15, year: 2015}))
Это печатает undefined
Так же это
let x = new WeakMap()
let d = {month: 1, date: 15, year: 2015}
x.set(d, {month: 1, date: 15, year:2015})
console.log(x.get({month: 1, date: 15, year: 2015}))
Единственный задан способ заставить его работать и получить по той же ссылке:
let x = new WeakMap()
let d = {month: 1, date: 15, year: 2015}
x.set(d, {month: 1, date: 15, year:2015})
console.log(d)
, которая не работает в следующем коде, потому что let
индивидуально ограничивается на каждой итерации reduce
this.grouped_messages = this.current_conversation.messsages.sort((a, b) => (new Date(a.date) >
new Date(b.date)) ? 1 : -1).reduce((agg, item) => {
let date = new Date(item.date)
let group = {month: date.getMonth(), date: date.getDate(), year: date.getFullYear()};
agg.set(group, [...(agg.get(group) || []), item])
return agg
}, new WeakMap())
Я полностью осведомлен о ссылочном равенстве и равенстве объектов по значению, но как я могу обойти эту проблему? Я создаю оболочку вокруг WeakMap
для введения итерации, аналогично предложению , чтобы позволить Angular pipe * 1029 иметь возможность принимать WeakMap, поэтому клиенты должны иметь возможность передать объекты, которые они сами построили, и получить те же результаты