拼合字典中的嵌套数组

时间:2018-09-27 22:27:29

标签: arrays typescript dictionary nested handsontable

我有一本字典,它有一个嵌套数组,例如

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

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

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

我在Google上搜索并找到了一些解决方案,这些解决方案与主题密切相关,但不完全是我需要的: 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

我是打字稿的新手,真的很想帮忙。

3 个答案:

答案 0 :(得分:0)

我认为没有任何自动方法可以执行所需的操作,因此只需按一下键并手动构建新对象即可。

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
}

答案 1 :(得分:0)

这是将拼合嵌套数组(仅深一层)的函数。循环浏览嵌套数组的所有值,并将它们添加为父对象的属性,然后删除嵌套数组。

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

答案 2 :(得分:0)

Purer方式:

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