首页 > 解决方案 > 获取对象数组,在对象中查找嵌套数组,计算 TotalAmount 并添加回原始对象

问题描述

到目前为止,这是我对对象所做的更复杂的任务之一,我一直在思考如何做到这一点,或者是否有可能。

假设我有一个看起来像这样的对象数组 -

[
                {
                    "id": "5555",
                    "title": "Invoice",
                    "amount": 2,
                    "address": "12",
                    "items": [
                        {
                            "title": "foobar",
                            "amount": 2,
                            "quantity": 1,
                            "discount": 0,
                            "taxes": [
                                {
                                    "rate": 10,
                                    "name": "tax"
                                }
                             ]
                        }
                    ]
                }
]

我需要拿走这个东西。乘以金额*数量,然后乘以税收。所以(金额*数量)*税。然后当我得到这个答案时,将它添加回原来的对象,就像这样 -

[
                {
                    "id": "5555",
                    "title": "Invoice",
                    "amount": 2,
                    "address": "12",
                    "items": [
                        {
                         "title": "foobar",
                         "amount": "2.2",
                         "tax": ".2"
                      }
                    ]
                }
]

我相信做到这一点的方法是使用 .map() 函数,但是我正在努力解决如何获得 A。如何计算并将其添加回原始金额以获得总金额。B. 一旦我有了这个添加完成的总量,如何将新的 Items 数组添加回原始对象。

到目前为止我所拥有的以及我陷入困境的地方 -

var initialArr = input.testArr; 

const newArr = initialArr.map(invoice => {

  return invoice.items;
  
});

const calcArr = newArr.map(items => {
 
  return {
    totalAmount :  (newArr.amount * newArr.quantity)
  }
  
});

  console.log(calcArr);

totalAmount 出现为空,一旦我有了这个总额,我仍然需要将金额乘以税率,然后将其添加回 totalAmount,然后将这个已完成的对象添加回。

标签: javascript

解决方案


看起来它应该相对简单。遍历每个对象并items用 重新分配其数组属性.map。从每个子项中取出金额、标题和税金,通过展平taxes数组中的所有税金来计算税金金额,然后返回一个包含税金金额的新对象,并将税金金额添加到原始金额:

const input = [
                {
                    "id": "5555",
                    "title": "Invoice",
                    "amount": 2,
                    "address": "12",
                    "items": [
                        {
                            "title": "foobar",
                            "amount": 2,
                            "quantity": 1,
                            "discount": 0,
                            "taxes": [
                                {
                                    "rate": 10,
                                    "name": "tax"
                                }
                             ]
                        }
                    ]
                }
];

for (const obj of input) {
  obj.items = obj.items.map(({
    amount,
    title,
    taxes
  }) => {
    const totalTaxPercent = taxes.reduce((a, b) => a + b.rate, 0);
    const tax = (totalTaxPercent / 100) * amount;
    return {
      title,
      amount: String(amount + tax),
      tax: String(tax),
    };
  });
}
console.log(input);


推荐阅读