使用一些函数式编程将一个对象映射到另一个对象



我想以更实用的样式将一个对象数组映射到另一个对象数组中,我正在使用打字稿。

基本上我正在使用删除来删除对象上的属性,我想知道是否有更好的方法来编写它。

  const data = props.data.map(d => ({
    order: d.position,
    logs: d.batches.map(b => {
      let log= {
        amount: b.scrap,
        batchNumber: '', // NO GOOD
      }
      if (!b.batch || b.batch.length === 0) {
        delete log.batchNumber // NO GOOD
      }
      return log
    }),
  }))

示例输入数据:

const data = [
    position: 1,
    batches: [
         {batchNumber: '', ammount: 3}
    ]
]

结果:

const data = [{
        order: 1,
        logs:[ {ammount:3}]
    }
]

您可以对批处理执行另一个map以返回新的对象数组,并将其附加到返回的对象:

const out = data.map(({ position: order, batches }) => {
  const logs = batches.map(({ batchNumber, ammount }) => {
    if (batchNumber) return { batchNumber, ammount };
    return { ammount };
  });
  return { order, logs }
});

演示

一种方法是创建目标的浅拷贝,省略要删除的键,例如:

let drop = key => obj => Object.keys(obj).reduce((r, k) =>
    k === key ? r : {...r, [k]: obj[k]}, {});
let test = [
    {foo:11, bar:2, baz: 3},
    {foo:22, bar:2, baz: 3},
    {foo:33, bar:2, baz: 3},
    ];
console.log(test.map(drop('bar')));

要向组合中添加另一个选项:可以使用 Object.assign 来选择性地分配属性:

const data = [{
  position: 1,
  batches: [{batchNumber: '',ammount: 3}, {batchNumber: 'withNr',ammount: 4}]
}];
 
const res = data.map(d => 
  ({
    order: d.position,
    logs : d.batches.map(({ammount, batchNumber}) => Object.assign({ammount}, batchNumber ? {batchNumber} : null ))
  })
);
 
 console.log(res);

最新更新