Skip to content

Instantly share code, notes, and snippets.

@halityurttas
Created October 8, 2019 10:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save halityurttas/c4e50fef7554dba4a5cc69a1c9ae5ae9 to your computer and use it in GitHub Desktop.
Save halityurttas/c4e50fef7554dba4a5cc69a1c9ae5ae9 to your computer and use it in GitHub Desktop.
Coldfusion object property name flatter with dot notations. Also support index based arrays.
<cfcomponent>
<cffunction name="flatten" access="public" returntype="array">
<cfargument name="data" type="any">
<cfargument name="flattenArray" type="array" default="#arrayNew(1)#">
<cfargument name="parentName" type="string" default="">
<cfset arguments.flattenArray = flattenFactory( arguments.data, arguments.flattenArray, arguments.parentName )>
<cfreturn arguments.flattenArray>
</cffunction>
<cffunction name="flattenFactory" access="public" returntype="array">
<cfargument name="data" type="any">
<cfargument name="flattenArray" type="array">
<cfargument name="parentName" type="string">
<cfif isStruct( arguments.data )>
<cfreturn this.flattenStruct( arguments.data, arguments.flattenArray, arguments.parentName )>
</cfif>
<cfif isArray( arguments.data )>
<cfreturn this.flattenArray( arguments.data, arguments.flattenArray, arguments.parentName )>
</cfif>
<cfreturn arguments.flattenArray>
</cffunction>
<cffunction name="flattenStruct" access="public" returntype="array">
<cfargument name="data" type="struct">
<cfargument name="flattenArray" type="array">
<cfargument name="parentName" type="string">
<cfif arrayContains( arguments.flattenArray, arguments.parentName )>
<cfset arrayDelete( arguments.flattenArray, arguments.parentName )>
</cfif>
<cfloop collection="#arguments.data#" item="attr">
<cfset elementName = ( len( arguments.parentName ) ? arguments.parentName & "." : "" ) & attr>
<cfset arrayAppend( arguments.flattenArray, elementName )>
<cfset arguments.flattenArray = flattenFactory( arguments.data[attr], arguments.flattenArray, elementName )>
</cfloop>
<cfreturn arguments.flattenArray>
</cffunction>
<cffunction name="flattenArray" access="public" returntype="array">
<cfargument name="data" type="array">
<cfargument name="flattenArray" type="array">
<cfargument name="parentName" type="string">
<cfloop array="#arguments.data#" index="i" item="attr">
<cfset elementName = ( len( arguments.parentName ) ? arguments.parentName : "" ) & "[" & i & "]">
<cfset arrayAppend( arguments.flattenArray, elementName )>
<cfset arguments.flattenArray = flattenFactory( attr, arguments.flattenArray, elementName )>
</cfloop>
<cfreturn arguments.flattenArray>
</cffunction>
</cfcomponent>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment