#jquery #ruby #json #coffeescript
#jquery #ruby #json #coffeescript
Вопрос:
У меня есть эта полезная нагрузка JSON, и я хотел бы использовать ее в нескольких местах, и мне было интересно, как отклонить два ключа от этого.
@metaTagsAdvanced = {
App: { comparison: ['was', 'was not'], value: ['Opened in the last two days', 'Opened in the last two weeks', 'Opened in the last month'], enabled: true },
AppVersion: { comparison: ['equals', 'not equal', 'greater than', 'less than', 'greater than or equal', 'less than or equal'], value: 'string', enabled: true },
ControlGroup: { comparison: ['less than', 'less than or equal', 'greater than', 'greater than or equal', 'equals'], value: 'number', numberOptions: {min: 1, max: 10}, enabled: true },
Country: { comparison: ['is', 'is not'], value: 'country', enabled: true },
Deliverable: { comparison: ['is', 'is not'], value: ['Push Notification','Local Push Notification', 'App Originated Push', 'In-App Alert', 'In-App Content', 'SMS', 'MMS', 'Email', 'Rich Message'], enabled: true },
Event: {comparison: {eventNumber: ['did occur N days ago', 'did occur greater than N days ago','did occur greater than or equal to N days ago','did occur less than N days ago','did occur less than or equal to N days ago', 'did not occur N days ago','did not occur greater than N days ago','did not occur greater than or equal to N days ago','did not occur less than N days ago','did not occur less than or equal to N days ago'], standards: ['did occur', 'did not occur']}, value: 'events', enabled: true},
InstallDate: { comparison: ['before', 'was', 'after', 'within', 'days ago', 'greater than N days ago', 'greater than or equal to N days ago','less than N days ago', 'less than or equal to N days ago'], value: 'date', enabled: true },
Language: { comparison: ['is', 'is not'], value: 'language', enabled: true },
LastOpenDate: { comparison: ['before', 'was', 'after', 'within', 'N days ago', 'greater than N days ago', 'greater than or equal to N days ago', 'less than N days ago', 'less than or equal to N days ago'], value: 'date', enabled: true },
OS: { comparison: ['is', 'is not'], value: ['android', 'ios'], enabled: true },
PushOpenRate: { comparison: ['greater than or equal', 'less than or equal'], value: ['0', '0.1', '0.2', '0.3', '0.4', '0.5', '0.6', '0.7', '0.8', '0.9', '1'], enabled: true },
Segment: {comparison: ['is in'], value: 'segments', enabled: true},
Sessions: { comparison: ['less than', 'greater than'], value: 'number', numberOptions: {min: 1}, enabled: true },
Tag: {comparison: {string: ['is', 'is not', 'contains'], double: ['equals', 'not equal to', 'less than', 'greater than', 'less than or equal', 'greater than or equal'], timestamp: ['before', 'after', 'was', 'within', 'N days ago', 'greater than N days ago', 'greater than or equal to N days ago','less than N days ago','less than or equal to N days ago'], segment: ['is in', 'is not in'], standard: ['exists', 'does not exist']}, value: 'tags', enabled: true},
Timezone: {comparison: ['is', 'is not'], value: 'timezone', enabled: true}
}
Итак, я хочу вставить экземпляр, как вы можете видеть ниже. Однако, как я мог бы изменить этот код, чтобы отклонить / исключить ключ «Сегмент» и «Часовой пояс» сверху?
filters = $.extend({}, @metaTagsAdvanced)
Я был бы очень признателен за любую помощь в этом, поскольку это позволило бы мне значительно реорганизовать часть моего кода! (Я использую coffeescript, поэтому он отформатирован так, как он есть!)
Приветствия
Комментарии:
1. Почему бы просто не использовать и не удалить ненужные ключи? O_O
2. Каково имя файла, содержащего строку
filters = $.extend({}, @metaTagsAdvanced)
?3. Все это в одном файле,
filters = $.extend({}, @metaTagsAdvanced)
просто дальше в файле.
Ответ №1:
Я бы использовал служебную библиотеку, такую как Lodash или underscore, которая была бы более надежной, чем это решение, но вы могли бы сделать что-то подобное, если вы не хотите полагаться на собственные методы прототипа в массиве. Прерывистые инструкции журнала, чтобы показать, как он создается.
jsfiddle здесь: http://jsfiddle.net/TRqG8 /
Только jQuery
someTags =
Foo: {foo: 'bar'}
Bar: {foo: 'bar'}
Baz: {foo: 'bar'}
_keys = (obj)-> $.map(obj, (value, key)-> key) # seems odd that key is last but that appears to be the way jQuery 2.1.0 works.
console.log _keys(someTags) # => ["Foo", "Bar", "Baz"]
_in = (arr, key)-> arr.indexOf(key) != -1
console.log _in(_keys(someTags), 'Foo') #=> true
# there is a native filter function for Array.prototype
_filter = (obj, keys...)->
objKeys = _keys(obj)
# a poor man's reduce
ob = {}
for k in objKeys
ob[k] = obj[k] unless _in(keys, k)
ob
console.log _filter(someTags, 'Bar') #=> Object {Foo: Object, Baz: Object}
console.log $.extend({}, _filter(someTags, 'Bar', 'Baz')) #=> Object {Foo: Object}
Подчеркивание
напротив, используя подчеркивание, вы могли бы сделать что-то вроде этого:
someTags =
Foo: {foo: 'bar'}
Bar: {foo: 'bar'}
Baz: {foo: 'bar'}
console.log _.extend({}, _.omit(someTags, 'Bar'))
jsfiddle: http://jsfiddle.net/nUSM8/1 /
Комментарии:
1. Я показал использование
extend
, предполагая, что вы планируете использоватьextend
expected . Если вы просто хотите фильтровать, вы можете игнорировать вызовы extend .2. Джед, это именно то, что я искал, и я уже использую подчеркивание в своем проекте, так что это очень полезно!
3. было довольно весело работать! Пища для размышлений: используйте слова с заглавной буквы для функций конструктора (например, те, для создания которых вы используете «new»
new Object()
). Даже если вы можете использовать их в качестве ключей, вы избавите себя от головной боли в будущем, избежав этой синтаксической ловушки.4. Как мне расширить существующий объект, используя подчеркивание, чтобы добавить некоторые теги?
_.extend({}, _.something(Blah, someTags)
5.
_.extend({Blah: {}}, _.omit(someTags, 'Bar'))
Я думаю, это то, что вы хотите.