在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),但是用一种方法没有解决多个字段的问题,我已经找到了更多解决方案
答案 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;
}