JS Слабая карта не может вывести равенство на свободных объектах - Взлом канала значения ключа для WeakMap - PullRequest
0 голосов
/ 19 марта 2020

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, поэтому клиенты должны иметь возможность передать объекты, которые они сами построили, и получить те же результаты

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...