是For ... In循环中唯一的用于创建对象的选项吗?

时间:2018-12-16 16:03:41

标签: javascript node.js

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

1 个答案:

答案 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 });

这是否比发布的代码“更好”是主观的。有点短;这会使它更具可读性或可维护性吗?不同的人会给出不同的答案。

关于性能,对于任何实际应用,几乎任何简单的迭代方法都将与另一种方法一样快。如果您有数百万个这样的批次,那么绝对不会使迭代“快速”。