是仅使用For-In循环选项来创建具有属性的对象,还是有更好的方法?我想创建一个对象而不是数组。
当前它循环数据。使用for-in循环进行批处理,并进行一些总计计算和属性映射。
例如:
let data = {
Batch: {
111: { BatchId: 111, Name: "Batch 1", Count2017: 100, Count2018: 100 },
222: { BatchId: 222, Name: "Batch 2", Count2017: 200, Count2018: 300 }
}
};
function calculateBatch(batch) {
mappedObject = {};
let grandTotal = 0;
for (const batchId in data.Batch) {
let total = data.Batch[batchId].Count2017 + data.Batch[batchId].Count2018;
mappedObject[batchId] = {
BatchId: batchId,
Name: data.Batch[batchId].Name,
Total: total
};
grandTotal += total
}
return {
Batch: mappedObject,
GrandTotal: grandTotal
}
}
console.log(calculateBatch(data.Batch));
答案 0 :(得分:2)
您可以使用Object.keys()
获取属性名称数组,然后使用.reduce()
创建结果对象:
return Object.keys(batch).reduce(function(result, key) {
let total = batch[key].Count2017 + batch[key].Count2018;
result.Batch[key] = {
BatchID: key,
Name: batch[key].Name,
Total: total
};
result.GrandTotal += total;
return result;
}, { Batch: {}, GrandTotal: 0 });
这是否比发布的代码“更好”是主观的。有点短;这会使它更具可读性或可维护性吗?不同的人会给出不同的答案。
关于性能,对于任何实际应用,几乎任何简单的迭代方法都将与另一种方法一样快。如果您有数百万个这样的批次,那么绝对不会使迭代“快速”。