Coffeescript конвертирует Array в Dict, где dict будет иметь несколько значений - PullRequest
1 голос
/ 24 мая 2019

В coffeescript я пытаюсь преобразовать массив объектов в dict, где в качестве ключа берется одно из значений объекта, а все объекты в массиве с этим значением и выше как находящиеся в массив в dict связан с этим ключом.

Я попробовал предложенный здесь код, но в результате получается максимум один объект на ключ. https://coffeescript -cookbook.github.io / разделы / массивы / создание-а-словарь-объекта-от-в-массива

Я не смог найти других примеров, которые бы приводили к одному значению на ключ.

Так, например (расширяя приведенный выше пример) у меня есть массив

cats = [
  {
    name: "Bubbles"
    age: 1
  },
  {
    name: "Sparkle"
    favoriteFood: "tuna"
    age: 2
  },
  {
    name: "Felix"
    age: 2
  }
]

Я хочу, чтобы мой результат был

catDict = {
    1: [
         {
           name: "Bubbles"
           age: 1
         }
       ]
    2: [

         {
           name: "Sparkle"
           favoriteFood: "tuna"
           age: 2
         },
         {
           name: "Felix"
           age: 2
         }
       ]
}

Ответы [ 2 ]

1 голос
/ 24 мая 2019
catDict = {}
(catDict[cat.age]?.push(cat) or catDict[cat.age] = [cat]) for cat in cats

Я использовал вариант доступа экзистенциального оператора ?., чтобы впитать пустые ссылки. Когда встречается нулевая ссылка, запускается вторая половина or для инициализации массива.

Это короче, но я не уверен, что это более элегантно ...

0 голосов
/ 24 мая 2019

Classic, решение приходит сразу после того, как я сдаюсь и опубликую вопрос на StackOverflow, но вот мое решение:

addCatToDict = (cat, dict) ->
    key = cat.age 
    if key of dict then dict[key].push(cat) 
    else dict[key] = [cat]

catDict = {}
for cat in cats
    addCatToDict(cat, catDict)

интересно увидеть более элегантные решения

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