2013-08-22 2 views
4

В Python, если у вас есть словарь, состоящий из списков, какCoffeeScript словарь установлен по умолчанию

mydict = {'foo': [], 'bar':[3, 4]} 

, и если вы хотите добавить что-то в том, что списки можно сделать

mydict.setdefault('baz', []).append(5) 

не писать

key, list_element = 'baz', 5 
if key in mydict: 
    mydict[key].append(list_element) 
else: 
    mydict[key] = [list_element] 

есть ли эквивалент для этого в Coffeescript?

+1

В Python то, что вы действительно хотите, вероятно, является 'collection.defaultdict (list)'. Тогда добавление значения - 'mylist ['baz']. Append (5)'. (Кроме того, 'mylist' является вводящим в заблуждение именем для dict.) – user2357112

+0

извините, исправлено :) – oguzalb

+1

Использование setdefault для кода Python вместо' collections.defaultdict' отлично, я действительно предпочитаю его, потому что вы все еще используете обычный так что вы получите KeyErrors при ссылке на несуществующие элементы вместо пустого списка (или что бы то ни было, что создает defaultdict). –

ответ

1

Вот один вариант:

(mydict.baz or (mydict.baz = [])).push(5) 

В этом случае CoffeeScript очень похож на JavaScript он генерирует:

(mydict.baz || (mydict.baz = [])).push(5); 
+1

Существует также '(mydict.baz || = []). Push (6)', если вы не хотите упоминать 'baz' дважды. –

0

Если вы не против использования underscore.js.

http://underscorejs.org/#defaults

var iceCream = {flavor : "chocolate"}; 
_.defaults(iceCream, {flavor : "vanilla", sprinkles : "lots"}); 
=> {flavor : "chocolate", sprinkles : "lots"} 
8

я рекомендую использовать ||/or для проверки членства, это в основном умный трюк, который будет молча терпеть неудачу против falsy значений. я предпочитаю писать

(mydict[ name ]?= []).push value 

, который я нахожу более ясным; он полагает, что в случае, если mydict не имеет записи для name или , то это значение равно null или undefined, после чего в этот момент следует положить пустой список.

Смежные вопросы