UNPKG

theprogrammablemind

Version:

82 lines (78 loc) 2.65 kB
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 }