50 lines
1.0 KiB
JavaScript
50 lines
1.0 KiB
JavaScript
exports.set = function (target, path, value) {
|
|
const fields = path.split('.')
|
|
let obj = target
|
|
const l = fields.length
|
|
for (let i = 0; i < l - 1; i++) {
|
|
const key = fields[i]
|
|
if (!obj[key]) {
|
|
obj[key] = {}
|
|
}
|
|
obj = obj[key]
|
|
}
|
|
obj[fields[l - 1]] = value
|
|
}
|
|
|
|
exports.get = function (target, path) {
|
|
const fields = path.split('.')
|
|
let obj = target
|
|
const l = fields.length
|
|
for (let i = 0; i < l - 1; i++) {
|
|
const key = fields[i]
|
|
if (!obj[key]) {
|
|
return undefined
|
|
}
|
|
obj = obj[key]
|
|
}
|
|
return obj[fields[l - 1]]
|
|
}
|
|
|
|
exports.unset = function (target, path) {
|
|
const fields = path.split('.')
|
|
let obj = target
|
|
const l = fields.length
|
|
const objs = []
|
|
for (let i = 0; i < l - 1; i++) {
|
|
const key = fields[i]
|
|
if (!obj[key]) {
|
|
return
|
|
}
|
|
objs.unshift({ parent: obj, key, value: obj[key] })
|
|
obj = obj[key]
|
|
}
|
|
delete obj[fields[l - 1]]
|
|
// Clear empty objects
|
|
for (const { parent, key, value } of objs) {
|
|
if (!Object.keys(value).length) {
|
|
delete parent[key]
|
|
}
|
|
}
|
|
}
|