展平字典中的嵌套数组

Posted

技术标签:

【中文标题】展平字典中的嵌套数组【英文标题】:Flatten nested array in dictionary 【发布时间】:2019-03-03 21:32:43 【问题描述】:

我有一个包含嵌套数组的字典,比如说

let data = "date" : "01.01.2017", "foo":["mama", "papa", "sister", "brother"];

现在,我需要(想要)使 'foo' 数组成为字典的一部分,以便 'data' 看起来像:

let newData = "date" : "01.01.2017", "foo_1":"mama", "foo_2":"papa", "foo_3":"sister", "foo_4":"brother";

我在谷歌上搜索并找到了一些与主题相近的解决方案,但并不完全是我需要的: https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Array/flatMap

https://gist.github.com/ArtemAvramenko/d92c92ff1b74cbc55be226dcabff90cc

Flattening a Javascript dictionary, preserving the nested keys

我是打字稿的新手,非常需要帮助。

【问题讨论】:

【参考方案1】:

更纯粹的方式:

Object.entries(data)
    .reduce((result, entry) => 
        const [key, value] = entry;
        if (Array.isArray(value))
            value.forEach((v, i) => result[`$key_$i`] = v);
        else
            result[key] = value;
        return result;
    , );

【讨论】:

【参考方案2】:

这是一个可以展平嵌套数组的函数(只有一层深度)。循环遍历嵌套数组的所有值并将它们添加为父对象的属性,然后删除嵌套数组。

let data = "date": "01.01.2017", "foo": ["mama", "papa", "sister", "brother"];

function flattenNested(obj: Object) 
    for (let prop in obj) 
        if (obj[prop] instanceof Array) 
            obj[prop].forEach((val, index) => 
                obj[prop + '_' + (index + 1)] = val;
            );
            delete obj[prop];
        
    
    return obj;


console.log(flattenNested(data));
//  date: "01.01.2017", foo_1: "mama", foo_2: "papa", foo_3: "sister", foo_4: "brother" 

【讨论】:

【参考方案3】:

我认为没有任何自动方式可以做你想做的事,所以只需通过键并手动构建新对象。

let newData = date: data.date

data.foo.forEach((value, index) => 
    newData["foo_"+(index+1)] = value
)

这是一种更通用的方法,以防您的数据更加多变。这只是遍历原始对象中的所有键,如果它们是数组,则将它们与您的示例类似地展平,如果不是,则直接复制它们。

function flattenKeys (data) 
    let newData = 

    Object.keys(data).forEach(key => 
        if (Array.isArray(data[key])) 
            data[key].forEach((value, index) => 
                // build a new set of keys based on the name of the original
                newData[key + "_" + (index+1)] = value
            )
         else 
            newData[key] = data[key]
        
    

    return newData

【讨论】:

以上是关于展平字典中的嵌套数组的主要内容,如果未能解决你的问题,请参考以下文章

如何展平 rxjs 中的嵌套数组

使用 jq 为 JSON 对象的嵌套数组中的属性展平数组

展平嵌套数组。 (爪哇)

在 BigQuery 上展平多个嵌套数组

如何使用 pyspark 在 aws 胶水中展平嵌套 json 中的数组?

将嵌套的 JSON 对象展平并排序到 javascript 中的数组中