Skip to content

Instantly share code, notes, and snippets.

@kovchiy
Created May 16, 2017 07:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kovchiy/475bec320e2063cb1b0bb1df36ea765c to your computer and use it in GitHub Desktop.
Save kovchiy/475bec320e2063cb1b0bb1df36ea765c to your computer and use it in GitHub Desktop.

Dig

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>
        )
    )
})

Dig(context:object, path:string, callback:function) :boolean

  • content — ссылка на данные
  • path — путь по данным
  • callback — функция, которая выполнится в контексте найденных данных; первый аргумент функции — снова ссылка на контекст (для замыканий), а второй — индекс элемента при выполнении в контексте массива.

path

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 () {...})

callback

У передаваемой функции может быть свой 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}
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment