Safe json data extraction.
Перед обращением к полям данных, пришедших от серверной ручки, нужно предвариетльно проверить наличие этих полей — в противном случае, код время от времени будет падать, а затем обрастать громоздкими условиями с проверкой всего на свете:
if (json.tv && Array.isArray(json.tv.events)) {
json.events.forEach(function (event) {
if (event.time &&
event.time.text &&
event.event &&
event.event.text &&
event.actions &&
event.actions[0] &&
event.actions[0].data &&
event.actions[0].data.data) {
group.append(
<item href="{event.actions[0].data.data}"/>.append(
<time>{event.time.text}</time>,
<show>{event.event.text}</show>,
<action>{event.actions[0].data.data}</action>
)
)
}
})
}
Предлагается такое решение:
Dig(json, 'tv.events[](time.text, event.text, event.actions[0].data.data)', function () {
group.append(
<item href="{this.actions[0].data.data}"/>.append(
<time>{this.time.text}</time>,
<show>{this.event.text}</show>,
<action>{this.actions[0].data.data}</action>
)
)
})
content
— ссылка на данныеpath
— путь по даннымcallback
— функция, которая выполнится в контексте найденных данных; первый аргумент функции — снова ссылка на контекст (для замыканий), а второй — индекс элемента при выполнении в контексте массива.
x.y
— обращение к вложенным полям
x[]
— обращение к каждому элементу массива
x[y]
— обращение к элементу массива с заданным индексом
x(y)
— обращение к x при условии наличия поля x.y
x(y, z)
— обращение к x при условии наличия y и z
x = y
— обращение к x при условии что x = y
x(y = z)
— обращение к x при условии что y = z
x | y
— обращение либо x, либо к y при неопределенном x
Сложные примеры:
Dig(json, 'supplementary.generic[0]', function () {...})
Dig(json, 'searchdata.docs[](url, doctitle)', function () {...})
Dig(json, 'searchdata.docs[]thumb(width, height)', function () {...})
Dig(
json,
'snippets.touch_retina_picture.src | snippets.touch_picture.src | snippets.desktop_picture.src',
function () {...}
)
Dig(
json,
'snippets.full.story.docs[](snippet, url, title, agency, time.epoch)',
function (doc, i) {...}
)
Dig(json, 'snippets.pre[0].data[]([0], [1])', function (sitelink, i) {...})
Dig(json, 'snippets.post[0](types.main = adresa)', function () {...})
У передаваемой функции может быть свой return. В таком случае, при успешном выполнении Dig
возвратит не просто true, а результат:
// В переменную href попадет созданный объект или false
var href = Dig(this, 'object[0](source.url)', function () {
return {href:this.source.url}
})
// В переменную hrefs попадет массив созданных объектов или false
var hrefs = Dig(this, 'object[](source.url)', function () {
return {href:this.source.url}
})