theprogrammablemind
Version:
82 lines (78 loc) • 2.65 kB
JavaScript
const project = (object, filter) => {
if (!object) {
return
}
const projection = {}
const set = (property, value) => {
if (value === null || value === undefined) {
return
}
projection[property] = value
}
if (Array.isArray(filter)) {
if (Array.isArray(object)) {
return object.map(element => project(element, filter))
} else {
for (let properties of filter) {
if (typeof properties === 'function') {
properties = properties(object)
}
if (typeof properties === 'object') {
if (properties.propertyLists) {
for (const propertyList in properties.propertyLists) {
if (object[propertyList]) {
for (const property of object[propertyList]) {
set(property, project(object[property], properties.propertyLists[propertyList]))
}
}
}
}
if (properties.valueLists) {
for (const listProperty in properties.valueLists) {
const old = object[listProperty]
if (Array.isArray(old)) {
set(listProperty, old.map((element) => project(element, properties.valueLists[listProperty])))
} else {
set(listProperty, project(old, properties.valueLists[listProperty]))
}
}
}
if (properties.properties) {
for (const property in properties.properties) {
const old = object[property]
set(property, project(old, properties.properties[property]))
}
}
if (properties.property) {
const property = properties.property
if (properties.isPropertyList) {
if (!Array.isArray(object[property])) {
continue
}
for (const propertyRef of object[property]) {
const old = object[propertyRef]
set(propertyRef, project(old, properties.filter))
}
} else {
const old = object[property]
set(property, project(old, properties.filter))
}
}
} else {
if (!Array.isArray(properties)) {
properties = [properties]
}
for (const property of properties) {
set(property, object[property])
}
}
}
}
} else if (typeof filter === 'object') {
for (const property of Object.keys(filter)) {
set(property, project(object[property], filter[property]))
}
}
return projection
}
module.exports = { project }