使用 lodash,如何在一个对象上设置多个属性?
Using lodash, how do I set multiple properties on an object?
我有一个属性列表,如下所示:
const list = [
'creditCardNumber',
'orderDetails.amount',
'customerInformation.details.email',
]
给定这样一个对象:
const someObj = {
creditCardNumber: '000 0000 0000 0000',
orderNumber: '1234',
orderDetails: { amount: 20, date: 'some date' },
customerInformation: { details: { email: 'some@email.com', joinedOn: 'someDate' } },
someOtherProp: 'some value',
}
使用 lodash
或 vanilla JS,有没有一种简单的方法来制作 obj 的副本,同时重写 list
数组上的位置值(到相同的值例如:[HIDDEN]
) 所以我们得到这样的结果?
{
const someObj = {
creditCardNumber: '[HIDDEN]',
orderNumber: '1234',
orderDetails: { amount:'[HIDDEN]', date: 'some date' },
customerInformation: { details: { email: '[HIDDEN]', joinedOn: 'someDate' } },
someOtherProp: 'some value',
}
Lodash _.set()
接受点分隔的对象路径,所以
_.set(obj, 'orderDetails.amount', 'TEST');
将解决为:
obj.orderDetails.amount = 'TEST'
将其与每个 list
项目的循环结合起来以获得所需的结果:
const list = [ 'creditCardNumber', 'orderDetails.amount', 'customerInformation.details.email' ];
const someObj = {creditCardNumber: '000 0000 0000 0000', orderNumber: '1234', orderDetails: { amount: 20, date: 'some date' }, customerInformation: { details: { email: 'some@email.com', joinedOn: 'someDate' } }, someOtherProp: 'some value', }
const newObj = _.clone(someObj);
list.forEach(key => _.set(newObj, key, '[HIDDEN]'));
console.log(newObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
{
"creditCardNumber": "[HIDDEN]",
"orderNumber": "1234",
"orderDetails":
{
"amount": "[HIDDEN]",
"date": "some date"
},
"customerInformation":
{
"details":
{
"email": "[HIDDEN]",
"joinedOn": "someDate"
}
},
"someOtherProp": "some value"
}
注意: 使用 _.clone()
到 'clone' 对象 ;)
使用香草 JS
使用 Object Destructuring and then using forEach 克隆对象添加 [HIDDEN]
值
const list = [
"creditCardNumber",
"orderDetails.amount",
"customerInformation.details.email",
];
const someObj = {
creditCardNumber: "000 0000 0000 0000",
orderNumber: "1234",
orderDetails: {
amount: 20,
date: "some date"
},
customerInformation: {
details: {
email: "some@email.com",
joinedOn: "someDate"
},
},
someOtherProp: "some value",
};
let clone = { ...someObj };
list.forEach((prop) => {
const splitProp = prop.split(".");
let obj = clone;
splitProp.forEach((p, i, arr) => {
if (i === arr.length - 1) {
obj[p] = `[HIDDEN]`;
} else {
obj = obj[p];
}
});
});
console.log(clone);
我有一个属性列表,如下所示:
const list = [
'creditCardNumber',
'orderDetails.amount',
'customerInformation.details.email',
]
给定这样一个对象:
const someObj = {
creditCardNumber: '000 0000 0000 0000',
orderNumber: '1234',
orderDetails: { amount: 20, date: 'some date' },
customerInformation: { details: { email: 'some@email.com', joinedOn: 'someDate' } },
someOtherProp: 'some value',
}
使用 lodash
或 vanilla JS,有没有一种简单的方法来制作 obj 的副本,同时重写 list
数组上的位置值(到相同的值例如:[HIDDEN]
) 所以我们得到这样的结果?
{
const someObj = {
creditCardNumber: '[HIDDEN]',
orderNumber: '1234',
orderDetails: { amount:'[HIDDEN]', date: 'some date' },
customerInformation: { details: { email: '[HIDDEN]', joinedOn: 'someDate' } },
someOtherProp: 'some value',
}
Lodash _.set()
接受点分隔的对象路径,所以
_.set(obj, 'orderDetails.amount', 'TEST');
将解决为:
obj.orderDetails.amount = 'TEST'
将其与每个 list
项目的循环结合起来以获得所需的结果:
const list = [ 'creditCardNumber', 'orderDetails.amount', 'customerInformation.details.email' ];
const someObj = {creditCardNumber: '000 0000 0000 0000', orderNumber: '1234', orderDetails: { amount: 20, date: 'some date' }, customerInformation: { details: { email: 'some@email.com', joinedOn: 'someDate' } }, someOtherProp: 'some value', }
const newObj = _.clone(someObj);
list.forEach(key => _.set(newObj, key, '[HIDDEN]'));
console.log(newObj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
{
"creditCardNumber": "[HIDDEN]",
"orderNumber": "1234",
"orderDetails":
{
"amount": "[HIDDEN]",
"date": "some date"
},
"customerInformation":
{
"details":
{
"email": "[HIDDEN]",
"joinedOn": "someDate"
}
},
"someOtherProp": "some value"
}
注意: 使用 _.clone()
到 'clone' 对象 ;)
使用香草 JS
使用 Object Destructuring and then using forEach 克隆对象添加 [HIDDEN]
值
const list = [
"creditCardNumber",
"orderDetails.amount",
"customerInformation.details.email",
];
const someObj = {
creditCardNumber: "000 0000 0000 0000",
orderNumber: "1234",
orderDetails: {
amount: 20,
date: "some date"
},
customerInformation: {
details: {
email: "some@email.com",
joinedOn: "someDate"
},
},
someOtherProp: "some value",
};
let clone = { ...someObj };
list.forEach((prop) => {
const splitProp = prop.split(".");
let obj = clone;
splitProp.forEach((p, i, arr) => {
if (i === arr.length - 1) {
obj[p] = `[HIDDEN]`;
} else {
obj = obj[p];
}
});
});
console.log(clone);