В целом мне кажется, что 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'у нам будет не нужно.
Как-то так.
В целом мне кажется, что jpath должен возвращать результат как можно более похожий на то, что соответствует обычному js-ному синтаксису. Т.е.
.foo.barэто более-менееdata.foo.bar. Никаких дополнительных оберток создаваться не должно. Грубо говоря, это возможность не писать что-то типаdata && data.foo && data.foo.barв случае простых объектов.Примеры.
.fooдолжен давать тоже самое, что иdata.foo,.foo.bar--data.foo.bar.Тоже самое. При этом
.foo.barдолжен возвращать именно этот массив в этом случае..*.barвозвращает[ 42, 24 ].Вообще, всякое появление
.*приводит к появлению обертки-массива. Даже в случае:.*.barвозвращает[ 42 ]..*.barвозвращает[ [ 42, 24 ], 66 ].Короче говоря,
.*возвращает массив, составленных из результатов всевозможных.foo..*.*возвращает[ [ 42, 24 ], [ 66 ] ]?До этого места как-то так все формулируется. Если в jpath'е
.a.b.c(простой jpath) нет.*иdata.a.b.cимеет смысл, то результатом этого jpath'а должно бытьdata.a.b.c..foo.barвозвращает[ 42, 24 ]. Т.е. тут так.data.fooимеет смысл, поэтому берем.foo(это вот этот массив data.foo) и к каждому его элементу применяем.bar(типа map)..foo.barвозвращает[ [ 42, 24 ], 66 ]..foo.*возвращает[ [ [ 42, 24 ] ], [ 66 ] ]?.foo.bar.booвозвращает[ [ [ 42, 24 ], 66 ], [ 73, [ 29, 44 ] ] ]?.*, или же мы на каком-то шаге получили массив и должны сделать еще один (или несколько) шаг внутрь его (пример 7.).itemsлежит именно массив, тогда можно модифицировать именно его и ничего сохранять по jpath'у нам будет не нужно.Как-то так.