更新Typescript / Javascript中的嵌套对象中的字段

时间:2018-09-06 17:12:12

标签: javascript typescript object nested

在Firestore中,您可以用点符号(https://firebase.google.com/docs/firestore/manage-data/add-data?authuser=0#update_fields_in_nested_objects)更新嵌套对象中的字段。我不知道如何在Typescript / Javascript中实现该功能。

例如以下对象:

const user = {
    id: 1
    details: {
        name: 'Max',
        street: 'Examplestreet 38',
        email: {
            address: 'max@example.com',
            verified: true
        }
    },
    token: {
        custom: 'safghhattgaggsa',
        public: 'fsavvsadgga'
    }
}

如何通过以下更改来更新该对象:

details.email.verified = false;
token.custom = 'kka';

我已经发现Lodash具有设置功能:

_.set(user, 'details.email.verified', false);

缺点:我必须为每个更改执行此操作。他们已经是用对象更新对象的方法了(就像Firestore一样)吗?

const newUser = ANYFUNCTION(user, {
    'details.email.verified': false,
    'token.custom' = 'kka'
});

// OUTPUT for newUser would be
{
        id: 1
        details: {
            name: 'Max',
            street: 'Examplestreet 38',
            email: {
                address: 'max@example.com',
                verified: false
            }
        },
        token: {
            custom: 'kka',
            public: 'fsavvsadgga'
        }
    }

有人知道对此有好的解决方案吗?如果我只想更改一个字段(Dynamically set property of nested object),但是用一种方法没有解决多个字段的问题,我已经找到了更多解决方案

2 个答案:

答案 0 :(得分:1)

我认为您一直在使用函数,但可以自己编写。不需要库:

NonNullType

如果您要合并2个对象,则有点棘手:

function set(obj, path, value) {
    let parts = path.split(".");
    let last = parts.pop();
    let lastObj = parts.reduce((acc, cur) => acc[cur], obj);
    lastObj[last] = value;
}

set(user, 'details.email.verified', false);

答案 1 :(得分:0)

与lodash _.set方法结合使用的一种解决方案可能是:

function setObject(obj, paths) {
        for (const p of Object.keys(paths)) {
            obj = _.set(obj, p, paths[p]);
        }
        return obj;
}