1- import { hasOwnProperty , isArray , isFile } from './objects'
1+ import { isFile } from './objects'
22
3- const getKey = ( parent : any , property : any ) => ( parent ? parent + '[' + property + ']' : property )
43export function objectToFormData ( obj : any , formData = new FormData ( ) , parent = '' ) : FormData {
5- if ( obj === null || obj === 'undefined' || obj . length === 0 ) {
4+ if ( obj == null || ( Array . isArray ( obj ) && obj . length === 0 ) ) {
65 formData . append ( parent , obj )
76 } else {
8- for ( const property in obj ) {
9- if ( hasOwnProperty ( obj , property ) ) {
10- appendToFormData ( formData , getKey ( parent , property ) , obj [ property ] )
11- }
7+ const propertyMap = new Map ( Object . entries ( obj ) )
8+ for ( const [ property , value ] of propertyMap ) {
9+ const key = parent ? ` ${ parent } [ ${ property } ]` : property
10+ appendToFormData ( formData , key , value )
1211 }
1312 }
1413 return formData
@@ -19,7 +18,7 @@ function appendToFormData(formData: FormData, key: string, value: any) {
1918 if ( typeof value === 'boolean' ) return formData . append ( key , value ? '1' : '0' )
2019 if ( value === null ) return formData . append ( key , '' )
2120 if ( typeof value !== 'object' ) return formData . append ( key , value )
22- if ( isArray ( value ) && hasFilesDeep ( value ) ) {
21+ if ( Array . isArray ( value ) && hasFilesDeep ( value ) ) {
2322 for ( let i = 0 ; i < value . length ; i ++ ) {
2423 formData . append ( key + '[' + i + ']' , value [ i ] , value [ i ] . name )
2524 }
@@ -28,28 +27,27 @@ function appendToFormData(formData: FormData, key: string, value: any) {
2827 objectToFormData ( value , formData , key )
2928}
3029export function hasFilesDeep ( obj : any ) : boolean {
31- if ( obj === null ) return false
30+ if ( ! obj ) return false
31+
3232 if ( typeof obj === 'object' ) {
33- for ( const key in obj ) {
34- if ( isFile ( obj [ key ] ) ) return true
35- }
33+ const objValues = Object . values ( obj )
34+ if ( objValues . some ( isFile ) ) return true
3635 }
37- if ( isArray ( obj ) ) {
38- let f = ''
39- for ( const key in obj ) {
40- if ( hasOwnProperty ( obj , key ) ) {
41- f = key
42- break
43- }
36+
37+ if ( Array . isArray ( obj ) ) {
38+ const nonNullElement = obj . find ( ( el ) => el !== null )
39+ if ( nonNullElement ) {
40+ return hasFilesDeep ( nonNullElement )
4441 }
45- return hasFilesDeep ( obj [ f ] )
4642 }
43+
4744 return isFile ( obj )
4845}
4946export function hasFiles ( form : any ) {
5047 for ( const prop in form ) {
51- const hasProp = hasOwnProperty ( form , prop ) || typeof window !== 'undefined'
52- if ( hasProp && hasFilesDeep ( form [ prop ] ) ) return true
48+ if ( Object . prototype . hasOwnProperty . call ( form , prop ) && hasFilesDeep ( form [ prop ] ) ) {
49+ return true
50+ }
5351 }
5452 return false
5553}
0 commit comments