展平字典中的嵌套数组

Flatten nested array in dictionary

我有一个有嵌套数组的字典,比方说

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

我是打字稿的新手,真的很想得到一些帮助。

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

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
}

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

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" }

更纯粹的方式:

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;
    }, {});