inververs
AutoIT Гуру
- Сообщения
- 2,135
- Репутация
- 465
Эта функция позволяет получить доступ к значению или записать значение в объектах scripting.dictionary любого уровня вложенности, используя при этом простой синтаксис.
К примеру, есть объект с такой структурой: (2D массив)
В нем имя sasha лежит по следующему пути: b.name, а ее возраст: b.age
Путь, это простое перечисление ключей слева направо.
Видишь, в пути я использую точку для разделения и мне кажется это гораздо проще чем писать как то так:
$object.item('b').item('name')
Т.к вложенность не ограничена, то давай добавим туда страну.
Добавим город и одну улицу: x.belarus.minsk.street = 'Lenina'
После этого наш объект станет таким:
Хотя раньше ветка x не существовала, она создалась. Очень удобно.
Добавим еще город brest и район в город minsk
Теперь объект такой:
Ну, а если точка уже занята, то нет проблем, используй любой другой символ, хоть ->
x->belarus->minsk->street
По пути можно вернуть целый объект. Просто укажи путь до него, скажем всю Беларусь можно вернуть по пути: x.belarus
Проще простого.
Вот такое вот удобное хранилище получилось. Пользуйтесь на здоровье.
[box title=Функция ObjPath]
Первый параметр - это объект scripting.dictionary
Второй ($path)- это путь
Третий ($value) используется для записи нового значения.
Четвертый ($delimiter) - это разделитель.[/box]
UPD: Теперь объекты можно переписывать
К примеру, есть объект с такой структурой: (2D массив)
Код:
{
"a": {
"name": "vasa",
"age": "29"
},
"b": {
"name": "sasha",
"age": "30"
}
}
Путь, это простое перечисление ключей слева направо.
Код:
$name = ObjPath($object, 'b.name')
$age = ObjPath($object, 'b.age')
Видишь, в пути я использую точку для разделения и мне кажется это гораздо проще чем писать как то так:
$object.item('b').item('name')
Т.к вложенность не ограничена, то давай добавим туда страну.
Добавим город и одну улицу: x.belarus.minsk.street = 'Lenina'
Код:
ObjPath($object, 'x.belarus.minsk.street', 'Lenina')
После этого наш объект станет таким:
Код:
{
"a": {
"name": "vasa",
"age": "29"
},
"b": {
"name": "sasha",
"age": "30"
},
"x": {
"belarus": {
"minsk": {
"street": "Lenina"
}
}
}
}
Добавим еще город brest и район в город minsk
Код:
ObjPath($object, 'x.belarus.brest.street', 'Lenina')
ObjPath($object, 'x.belarus.minsk.area', 'Centr')
Теперь объект такой:
Код:
{
"a": {
"name": "vasa",
"age": "29"
},
"b": {
"name": "sasha",
"age": "30"
},
"x": {
"belarus": {
"minsk": {
"street": "Lenina",
"area": "Centr"
},
"brest": {
"street": "Lenina"
}
}
}
}
Ну, а если точка уже занята, то нет проблем, используй любой другой символ, хоть ->
x->belarus->minsk->street
По пути можно вернуть целый объект. Просто укажи путь до него, скажем всю Беларусь можно вернуть по пути: x.belarus
Код:
$ret = ObjPath($object, 'x.belarus')
Проще простого.
Вот такое вот удобное хранилище получилось. Пользуйтесь на здоровье.
[box title=Функция ObjPath]
Первый параметр - это объект scripting.dictionary
Второй ($path)- это путь
Третий ($value) используется для записи нового значения.
Четвертый ($delimiter) - это разделитель.[/box]
Код:
Func ObjPath($object = Default, $path = Default, $value = Default, $delimiter = '.')
If $object = Default Then
$object = ObjCreate('Scripting.Dictionary')
If $path = Default Then
Return $object
EndIf
EndIf
If Not IsObj($object) Then
Return SetError(1, 'Не является объектом', '')
EndIf
Local Static $STR_ENTIRESPLIT = 1
Local $get = $value = Default, $set = Not $get
Local $item, $current = $object
Local $split = StringSplit($path, $delimiter, $STR_ENTIRESPLIT)
For $index = 1 To $split[0]
$item = $split[$index]
If $index = $split[0] And $set Then
;Т.к объект не добавляется через $current.item($item) = $value, то удалим старый и запишем новый
If IsObj($value) Then
$current.remove($item)
$current.add($item, $value)
Else
$current.item($item) = $value
EndIf
Return SetError(@error, 0, $object)
EndIf
If Not IsObj($current) Then
Return SetError(2, 'Попытка доступа не к объекту', '')
EndIf
If Not $current.exists($item) Then
If $get Then
Return SetError(3, 'Элемент не найден', '')
Else
$current.add($item, ObjCreate('scripting.dictionary'))
EndIf
EndIf
$current = $current.item($item)
Next
Return $current
EndFunc ;==>ObjPath
UPD: Теперь объекты можно переписывать