1
- import { hasOwnProperty , isArray , isFile } from './objects'
1
+ import { isFile } from './objects'
2
2
3
- const getKey = ( parent : any , property : any ) => ( parent ? parent + '[' + property + ']' : property )
4
3
export 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 ) ) {
6
5
formData . append ( parent , obj )
7
6
} 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 )
12
11
}
13
12
}
14
13
return formData
@@ -19,7 +18,7 @@ function appendToFormData(formData: FormData, key: string, value: any) {
19
18
if ( typeof value === 'boolean' ) return formData . append ( key , value ? '1' : '0' )
20
19
if ( value === null ) return formData . append ( key , '' )
21
20
if ( typeof value !== 'object' ) return formData . append ( key , value )
22
- if ( isArray ( value ) && hasFilesDeep ( value ) ) {
21
+ if ( Array . isArray ( value ) && hasFilesDeep ( value ) ) {
23
22
for ( let i = 0 ; i < value . length ; i ++ ) {
24
23
formData . append ( key + '[' + i + ']' , value [ i ] , value [ i ] . name )
25
24
}
@@ -28,28 +27,27 @@ function appendToFormData(formData: FormData, key: string, value: any) {
28
27
objectToFormData ( value , formData , key )
29
28
}
30
29
export function hasFilesDeep ( obj : any ) : boolean {
31
- if ( obj === null ) return false
30
+ if ( ! obj ) return false
31
+
32
32
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
36
35
}
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 )
44
41
}
45
- return hasFilesDeep ( obj [ f ] )
46
42
}
43
+
47
44
return isFile ( obj )
48
45
}
49
46
export function hasFiles ( form : any ) {
50
47
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
+ }
53
51
}
54
52
return false
55
53
}
0 commit comments