Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F99405577
formDataToJSON.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Fri, Jan 24, 06:45
Size
2 KB
Mime Type
text/x-java
Expires
Sun, Jan 26, 06:45 (1 d, 21 h)
Engine
blob
Format
Raw Data
Handle
23790886
Attached To
rOACCT Open Access Compliance Check Tool (OACCT)
formDataToJSON.js
View Options
'use strict'
;
import
utils
from
'../utils.js'
;
/**
* It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']
*
* @param {string} name - The name of the property to get.
*
* @returns An array of strings.
*/
function
parsePropPath
(
name
)
{
// foo[x][y][z]
// foo.x.y.z
// foo-x-y-z
// foo x y z
return
utils
.
matchAll
(
/\w+|\[(\w*)]/g
,
name
).
map
(
match
=>
{
return
match
[
0
]
===
'[]'
?
''
:
match
[
1
]
||
match
[
0
];
});
}
/**
* Convert an array to an object.
*
* @param {Array<any>} arr - The array to convert to an object.
*
* @returns An object with the same keys and values as the array.
*/
function
arrayToObject
(
arr
)
{
const
obj
=
{};
const
keys
=
Object
.
keys
(
arr
);
let
i
;
const
len
=
keys
.
length
;
let
key
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
key
=
keys
[
i
];
obj
[
key
]
=
arr
[
key
];
}
return
obj
;
}
/**
* It takes a FormData object and returns a JavaScript object
*
* @param {string} formData The FormData object to convert to JSON.
*
* @returns {Object<string, any> | null} The converted object.
*/
function
formDataToJSON
(
formData
)
{
function
buildPath
(
path
,
value
,
target
,
index
)
{
let
name
=
path
[
index
++
];
const
isNumericKey
=
Number
.
isFinite
(
+
name
);
const
isLast
=
index
>=
path
.
length
;
name
=
!
name
&&
utils
.
isArray
(
target
)
?
target
.
length
:
name
;
if
(
isLast
)
{
if
(
utils
.
hasOwnProp
(
target
,
name
))
{
target
[
name
]
=
[
target
[
name
],
value
];
}
else
{
target
[
name
]
=
value
;
}
return
!
isNumericKey
;
}
if
(
!
target
[
name
]
||
!
utils
.
isObject
(
target
[
name
]))
{
target
[
name
]
=
[];
}
const
result
=
buildPath
(
path
,
value
,
target
[
name
],
index
);
if
(
result
&&
utils
.
isArray
(
target
[
name
]))
{
target
[
name
]
=
arrayToObject
(
target
[
name
]);
}
return
!
isNumericKey
;
}
if
(
utils
.
isFormData
(
formData
)
&&
utils
.
isFunction
(
formData
.
entries
))
{
const
obj
=
{};
utils
.
forEachEntry
(
formData
,
(
name
,
value
)
=>
{
buildPath
(
parsePropPath
(
name
),
value
,
obj
,
0
);
});
return
obj
;
}
return
null
;
}
export
default
formDataToJSON
;
Event Timeline
Log In to Comment