【问题标题】:Dynamically generate a 2d array from JSON with varying columns从 JSON 动态生成具有不同列的二维数组
【发布时间】:2021-10-21 01:20:42
【问题描述】:

我有一个 json,我需要以 2d 数组的形式组织,并且已知在 json 迭代之后可以找到数字列,并且它们将被编号为 #1 #2 以用于对应的多组出现项目如下图/表格所示

预期的输出是二维数组

[
    ["firstName", "middleName", "lastName", "addresses: #1 type", "addresses: #1 poBox", "addresses: #1 streetAddress", "addresses: #1 city", "addresses: #1 region", "addresses: #1 postalCode", "addresses: #1 country", "addresses: #2 type", "addresses: #2 poBox", "addresses: #2 streetAddress", "addresses: #2 city", "addresses: #2 region", "addresses: #2 postalCode", "addresses: #3 poBox", "addresses: #3 region", "addresses: #3 postalCode", "addresses: #2 country", "photos: #1 url", "photos: #1 default", "photos: #2 url", "photos: #2 default"],
    ["John", "Joseph", "Briggs", "home", 111, "", "City1", "", "1ER001", "USA", "work", 222, "", "City2", "Region2", "1ER002", "", "", "", "", "photo.org/person1", "TRUE", "photo.org/person1", "TRUE"],
    ["Bill", "", "Thatcher", "home", "", "", "City3", "Region3", "1ER003", "USA", "work", 444, "", "", "Region4", "1ER004", 555, "Region5", "1ER005", "", "", "", "", ""]
]

The expected output is also shown here for better clarity

请注意,红色标题列不包含数据,也不需要在二维数组输出中。有 1000 个人群(行)具有相似的数据,例如有些没有邮政编码,有些缺少中间名,有些缺少照片

<!DOCTYPE html>
<html>

<body>
<script>



var crowds = [{
        "name": [{
            "firstName": "John",
            "middleName": "Joseph",
            "lastName": "Briggs"
        }],
        "addresses": [{
                "type": "home",
                "poBox": "111",
                "city": "City1",
                "postalCode": "1ER001",
                "country": "USA"
            },
            {
                "type": "work",
                "poBox": "222",
                "city": "City2",
                "region": "Region2",
                "postalCode": "1ER002"
            }
        ],
        "photos": [{
                "url": "photo.org/person1",
                "default": true
            },
            {
                "url": "imagur.org/person1",
                "default": true
            }
        ]
    },
    {
        "name": [{
            "firstName": "Bill",
            "lastName": "Thatcher"
        }],
        "addresses": [{
                "type": "home",
                "city": "City3",
                "region": "Region3",
                "postalCode": "1ER003",
                "country": "USA"
            },
            {
                "type": "work",
                "poBox": "444",
                "region": "Region4",
                "postalCode": "1ER004"
            }
            {
                "poBox": "555",
                "region": "Region5",
                "postalCode": "1ER005"
            }            
        ]
    }
]



var rows = [];
var headerRow = [];


crowds.forEach(function(crowd) {
    var cols = [];
    for (key in crowd) {
        headerRow.push(key + ":#")
        cols.push(crowd[key].firstName)
                cols.push(crowd[key].middleName)
                        cols.push(crowd[key].lastName)
    }
    rows.push(cols)
})

console.log(JSON.stringify(headerRow.concat(rows)))

</script>
</body>

</html>

【问题讨论】:

    标签: javascript arrays json multidimensional-array


    【解决方案1】:

    考虑

    function flatten(obj, res = {}, key = '') {
        let add = (d, s) => key ? key + d + s : s;
    
        if (Array.isArray(obj))
            obj.forEach((v, n) => flatten(v, res, add(' #', n + 1)))
        else if (typeof obj === 'object')
            Object.entries(obj).forEach(([k, v]) => flatten(v, res, add(': ', k)))
        else
            res[key] = obj
        return res
    }
    

    应用于您的数据

    let flats = crowds.map(obj => flatten(obj))
    console.log(flats)
    

    这将返回一个“扁平化”对象列表,如下所示:

    [
      {
        'name #1: firstName': 'John',
        'name #1: middleName': 'Joseph',
        'name #1: lastName': 'Briggs',
        'addresses #1: type': 'home',
        ...etc
      },
      {
        'name #1: firstName': 'Bill',
        'name #1: lastName': 'Thatcher',
        'addresses #1: type': 'home',
        ...etc
      }
    ]
    

    现在您必须在所有展平对象中构建所有键的联合:

    function combineKeys(objs) {
        let keys = objs.reduce((k, obj) => k.concat(Object.keys(obj)), [])
        return [...new Set(keys)]
    }
    
    let keys = combineKeys(flats)
    

    最后从键列表中创建一个表格:

    let table = flats.map(f => keys.map(k => f[k] ?? ''))
    

    【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 2021-06-30
    • 1970-01-01
    • 2019-01-12
    相关资源
    最近更新 更多