[英]Converting nested arrays to objects
[["seller" , [["id" , "1"], ["name", "test"]]], ["token", "aasfgsgd"], ["settings", [["general", false], ["store", [["trusted", true], ["socialMedia", [["fbConnected", true], ["igConnected", false]]]]]]]]
這個嵌套數組可以是可變的,因此將其轉換為如下所示的對象
{
"seller": {
"id": 1,
"name": "test"
},
"token": "aasfgsgd",
"settings": {
"general": false,
"store": {
"trusted": true,
"socialMedia": {
"fbConnected": true,
"igConnected": false
}
}
}
}
您可以使用帶有遞歸函數的Object.fromEntries()
將所有嵌套的[[key, value], ...]
對數組轉換為對象本身。
Object.fromEntries()
方法能夠接受一個數組,例如:
[["key", "val2"]]
...並將其轉換為對象:
{
"key": "val2"
}
但是,如果"val2"
本身是一個數組,則需要先將其轉換為對象。 這可以通過對作為數組的值條目遞歸調用Object.fromEntries()
來完成。
請參閱下面的示例:
const arr = [["seller" , [["id" , 1], ["name", "test"]]], ["token", "aasfgsgd"], ["settings", [["general", false], ["store", [["trusted", true], ["socialMedia", [["fbConnected", true], ["igConnected", false]]]]]]]]; const makeObject = arr => { return Object.fromEntries(arr.map( ([key, val]) => Array.isArray(val) ? [key, makeObject(val)] : [key, val] )); } console.log(makeObject(arr));
一種對瀏覽器更友好的方法是使用.reduce()
和擴展語法而不是Object.fromEntries()
:
const arr = [["seller" , [["id" , 1], ["name", "test"]]], ["token", "aasfgsgd"], ["settings", [["general", false], ["store", [["trusted", true], ["socialMedia", [["fbConnected", true], ["igConnected", false]]]]]]]]; const makeObject = arr => { return arr.reduce((o, [key, val]) => { return Object.assign(o, {[key]: Array.isArray(val) ? makeObject(val) : val}); }, {}); } console.log(makeObject(arr));
const array = [["seller" , [["id" , "1"], ["name", "test"]]], ["token", "aasfgsgd"], ["settings", [["general", false], ["store", [["trusted", true], ["socialMedia", [["fbConnected", true], ["igConnected", false]]]]]]]]; function objectify(arr) { return arr.reduce((acc, item) => { let builder; if (Array.isArray(item[0])) { builder = objectify(item[0]) } else { const propName = item[0]; const propValue = Array.isArray(item[1]) ? objectify(item[1]) : item[1]; builder = {[propName]: propValue}; } return { ...acc, ...builder } }, {}); } console.log(objectify(array));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.