我想以更实用的样式将一个对象数组映射到另一个对象数组中,我正在使用打字稿。
基本上我正在使用删除来删除对象上的属性,我想知道是否有更好的方法来编写它。
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);