【问题标题】:How to get max of in array of objects如何在对象数组中获取最大值
【发布时间】:2020-12-20 22:03:52
【问题描述】:

我正在尝试总结一个 JSON

var data = [
  {
    customerName: "Customer1",
    customerId: "1234",
    invoices: [
      {
        id: "647549",
        transactionId: "INV01",
        date: "10/12/2020",
        debit: 371.93,
        dueDate: "09/02/2021"
      }
    ],
    creditmemo: []
  },
  {
    customerName: "Customer5",
    customerId: "5678",
    invoices: [
      {
        id: "631109",
        transactionId: "INV05",
        date: "09/12/2020",
        debit: 206.92,
        dueDate: "08/02/2021"
      },
      {
        id: "664359",
        transactionId: "INV06",
        date: "11/12/2020",
        debit: 91.91,
        dueDate: "10/02/2021"
      }
    ],
    creditmemo: []
  }
];

我尝试了几种方法,最新的一种:

//console.log(data.length);
var data2 = [];
for (let value in data) {
  console.log(data[value].customerName);
  //console.log(data[value]);
  var invoices = [];
  invoices.push(data[value].invoices[0]);
  //console.log(1);
  //console.log(customer);
  /* var max = new Date(
    Math.max.apply(
      null,
      customer.map(function (o) {
        var dateString = o.dueDate;
        var dateParts = dateString.split("/");
        var dateObject = new Date(
          +dateParts[2],
          dateParts[1] - 1,
          +dateParts[0]
        );
        return new Date(dateObject);
      })
    )
  );*/
  var result = [
    invoices.reduce((acc, n) => {
      for (var prop in n) {
        console.log("prop: " + prop);
        if (prop === "debit") {
          if (acc[prop]) {
            acc[prop] += n[prop];
            console.log("OK");
          } else {
            acc[prop] = n[prop];
          }
        } else if (prop === "dueDate") {
          //acc[prop] = max;
        } else {
          acc[prop] = n[prop];
        }
      }
      return acc;
    }, {})
  ];
  data2.push(result);
}
console.log(data2);

我希望得到以下结果,将每个客户的发票的所有借方相加,得到每个客户的最大日期(我没有找到删除空属性贷项备忘录的方法

[
  {
    customerName: "Customer1",
    customerId: "1234",
    invoices: [
      {
        id: "647549",
        transactionId: "INV01",
        date: "10/12/2020",
        debit: 371.93,
        dueDate: "09/02/2021"
      }
    ]
  },
  {
    customerName: "Customer5",
    customerId: "5678",
    invoices: [
      {
        id: "631109-664359",
        transactionId: "INV05-INV06",
        date: "11/12/2020",
        debit: 298.83,
        dueDate: "08/02/2021"
      }
  }
];

【问题讨论】:

  • 当客户有两张以上的发票时,id 的值应该是多少?为什么要用破折号(-)分隔符的字符串,比如transactionId: "INV05-INV06",而不是id值的数组,比如transactionIds:["INV05","INV06"]
  • 使用此文件的系统只有一个发票描述字段,

标签: javascript arrays object nested


【解决方案1】:

这是一个相当简单的 map() 数据数组,带有一个嵌套的 reduce() 调用来重构 invoices 数组。 invoices 数组中的第一个元素作为初始累加器传递,并且仅当数组中有多个元素时才会对其进行重构。由于我们在每次映射迭代时都返回一个新对象,我们可以简单地省略 creditMemo 属性。

我同意评论者关于将多个 id 属性存储在数组中而不是串联字符串中的观点——这既是为了以后使用,也是为了简化重构。

const summary = data.map(({ customerName, customerId, invoices }) => {
  const debitSummary = invoices.reduce((acc, inv, i) => {
    if (i) {
      acc = {
        ...acc,
        id: acc.id + '-' + inv.id,
        transactionId: acc.transactionId + '-' + inv.transactionId,
        debit: acc.debit + inv.debit,
        date: new Date(inv.date) > new Date(acc.date) ? inv.date : acc.date,
      }
    }
    return acc;
  }, invoices[0]);
  return { customerName, customerId, invoices: [{...debitSummary}] };
});

console.log(summary);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script>
const data = [{ customerName: "Customer1", customerId: "1234", invoices: [{ id: "647549", transactionId: "INV01", date: "10/12/2020", debit: 371.93, dueDate: "09/02/2021" }], creditmemo: [] }, { customerName: "Customer5", customerId: "5678", invoices: [{ id: "631109", transactionId: "INV05", date: "09/12/2020", debit: 206.92, dueDate: "08/02/2021" }, { id: "664359", transactionId: "INV06", date: "11/12/2020", debit: 91.91, dueDate: "10/02/2021" }], creditmemo: [] }];
</script>

【讨论】:

  • 谢谢@pilchard,我已将您的代码调整为我们的日期格式(DDMMYYY)。
  • 太好了,我认为日期格式可能是个问题,很高兴你让它工作。
猜你喜欢
  • 1970-01-01
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 1970-01-01
相关资源
最近更新 更多