使用 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);