Skip to content

Правильное поведение jpath'а #5

Description

@pasaran

В целом мне кажется, что jpath должен возвращать результат как можно более похожий на то, что соответствует обычному js-ному синтаксису. Т.е. .foo.bar это более-менее data.foo.bar. Никаких дополнительных оберток создаваться не должно. Грубо говоря, это возможность не писать что-то типа data && data.foo && data.foo.bar в случае простых объектов.

Примеры.

data = {
    foo: {
        bar: 42
    }
};

.foo должен давать тоже самое, что и data.foo, .foo.bar -- data.foo.bar.

data = {
    foo: {
        bar: [ 42, 24 ]
    }
}

Тоже самое. При этом .foo.bar должен возвращать именно этот массив в этом случае.

data = {
    foo: {
        bar: 42
    },
    boo: {
        bar: 24
    }
}

.*.bar возвращает [ 42, 24 ].
Вообще, всякое появление .* приводит к появлению обертки-массива. Даже в случае:

data = {
    foo: {
        bar: 42
    }
}

.*.bar возвращает [ 42 ].

data = {
    foo: {
        bar: [ 42, 24 ]
    },
    boo: {
        bar: 66
    }
}

.*.bar возвращает [ [ 42, 24 ], 66 ].
Короче говоря, .* возвращает массив, составленных из результатов всевозможных .foo.

data = {
    foo: {
        a: 42,
        b: 24
    },
    bar: {
        c: 66
    }
}

.*.* возвращает [ [ 42, 24 ], [ 66 ] ]?

До этого места как-то так все формулируется. Если в jpath'е .a.b.c (простой jpath) нет .* и data.a.b.c имеет смысл, то результатом этого jpath'а должно быть data.a.b.c.

data = {
    foo: [
        {
            bar: 42
        },
        {
            bar: 24
        }
    ]
}

.foo.bar возвращает [ 42, 24 ]. Т.е. тут так. data.foo имеет смысл, поэтому берем .foo (это вот этот массив data.foo) и к каждому его элементу применяем .bar (типа map).

data = {
    foo: [
        {
            bar: [ 42, 24 ]
        },
        {
            bar: 66
        }
    ]
}

.foo.bar возвращает [ [ 42, 24 ], 66 ].
.foo.* возвращает [ [ [ 42, 24 ] ], [ 66 ] ]?

data = {
    foo: [
        {
            bar: [
                {
                    boo: [ 42, 24 ]
                },
                {
                    boo: 66
                }
            ]
        },
        {
            bar: [
                {
                    boo: 73
                },
                {
                    boo: [ 29, 44 ]
                }
            ]
        }
    ]
}

.foo.bar.boo возвращает [ [ [ 42, 24 ], 66 ], [ 73, [ 29, 44 ] ] ]?

  • В общем результат jpath'а должен давать тоже самое, что и обычная js-нотация для доступа к свойствам объекта (если по этим свойствам есть что-нибудь осмысленное).
  • Я считаю это нормально, что при изменении данных может измениться формат результата.
  • Массив-обертка создается только или если была .*, или же мы на каком-то шаге получили массив и должны сделать еще один (или несколько) шаг внутрь его (пример 7.).
  • Для сплита моделей можно сделать какие-то допущения-ограничения. Например, что по пути items лежит именно массив, тогда можно модифицировать именно его и ничего сохранять по jpath'у нам будет не нужно.

Как-то так.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions