遍历数组,将数组中key值相同的对象合并

  定义一个空数组接收汇总
  const TotalData = [];
  // 拿到明细数据 tempData 进行遍历
  tempData.forEach((value, key) => {
    //判断过滤后的数组是否为空
    if (TotalData.length == 0) {
      TotalData.push(value);
    } else {
      TotalData.forEach((valueIndex, keyIndex) => {
        if (valueIndex.itemCode && valueIndex.itemCode !== value.itemCode) {
          TotalData.push(value);
        } else if (
          valueIndex.itemCode &&
          valueIndex.itemCode === value.itemCode
        ) {
          // 含税金额
          valueIndex.totalAmt = valueIndex.totalAmt + value.totalAmt;
          // 含税金额本位币
          valueIndex.totalCurAmt =
            valueIndex.totalCurAmt + value.totalCurAmt;
          //  不含税金额
          valueIndex.exclTaxAmt = valueIndex.exclTaxAmt + value.exclTaxAmt;
          //  不含税金额本位币
          valueIndex.exclTaxCurAmt =
            valueIndex.exclTaxCurAmt + value.exclTaxCurAmt;
          //  税额
          valueIndex.taxAmt = valueIndex.taxAmt + value.taxAmt;
          //  税额本位币
          valueIndex.taxCurAmt = valueIndex.taxCurAmt + value.taxCurAmt;
        }
      });
    }
  });

在这里插入图片描述
就是封装一下

  sum = async (data) => {
    var arrayFilted = [];
    data.forEach(function (value, key) {
      //判断过滤后的数组是否为空
      if (arrayFilted.length == 0) {
        console.log('222');
        arrayFilted.push(value);
        console.log('arrayFilted');
      } else {
        console.log('333');
        arrayFilted.forEach(function (valueIndex, keyIndex) {
          console.log(valueIndex);
          if (valueIndex.itemCode && valueIndex.itemCode !== value.itemCode) {
            console.log('444');
            arrayFilted.push(value);
          } else if (
            valueIndex.itemCode &&
            valueIndex.itemCode === value.itemCode
          ) {
            console.log('555');
            valueIndex.qty = valueIndex.qty + value.qty;
            // 含税金额
            valueIndex.totalAmt += value.totalAmt;
            // 含税金额本位币
            valueIndex.totalCurAmt += valueIndex.totalCurAmt;
            //  不含税金额
            valueIndex.exclTaxAmt += valueIndex.exclTaxAmt;
            //  不含税金额本位币
            valueIndex.exclTaxCurAmt += valueIndex.exclTaxCurAmt;
            //  税额
            valueIndex.taxAmt = valueIndex.taxAmt + value.taxAmt;
            //  税额本位币
            valueIndex.taxCurAmt = valueIndex.taxCurAmt + value.taxCurAmt;
          }
        });
      }
    });
    await this.state.getDetailTableRef.clearRows();
    await this.state.getDetailTableRef.addRows(arrayFilted);
    await this.forDataArr(arrayFilted);
    return arrayFilted;
  };

注意的是,当我们编辑的时候可能就不能用这个方法了,因为我们不知道那个弹框是两级层所以用里一个方法,但是大差不差。

如图,也就是当我新增时候,点击了商品编码,然而它是个弹框所以我要判断
商品编码下的编码是否一致才可以汇总到汇总单,如果不一致就要单独计算,如果一致就求和计算展示。这里我们就要注意,拿到数据后要实时清空和添加表格数据才能做到实时更新。
在这里插入图片描述

在这里插入图片描述
代码如下
编辑了明细的某个值

  onDetailValuesChange = async (
    changedValues,
    allValues,
    record,
    formRef,
    editTableRef,
    extraData
  ) => {
    if (
      Object.keys(changedValues)[0] === 'itemCode' ||
      Object.keys(changedValues)[0] === 'qty' ||
      Object.keys(changedValues)[0] === 'exclTaxPrice' ||
      Object.keys(changedValues)[0] === 'price'
    ) {
      this.calcTotalAmt(true, extraData);
    }
  };
   calcTotalAmt = async (isDetailEditing = false, extraData: any = {}) => {
    const Assemble = this.state.editTableRef.getRows(); // 重新拿到表格数据
    this.sunArr(Assemble);
  };
  //当编辑了表格时把重新得到的表格数据 进行数据的数值相加处理
  sunArr = async (data) => {
    data.forEach((x) => {
      if (x.itemCode.itemCode) {
        x.itemCode.itemCode = x.itemCode.itemCode;
      } else {
        x.itemCode.itemCode = x.itemCode.spuCode;
      }
    });
    const newData = {};
    data.map((item) => {
      if (newData.hasOwnProperty(item.itemCode.itemCode)) {
        newData[item.itemCode.itemCode].push(item);
      } else {
        newData[item.itemCode.itemCode] = [];
        newData[item.itemCode.itemCode].push(item);
      }
    });
    let newArrData = [];
    for (let key in newData) {
      let qty = 0;
      let totalAmt = 0;
      let totalCurAmt = 0;
      let exclTaxAmt = 0;
      let exclTaxCurAmt = 0;
      let taxAmt = 0;
      let taxCurAmt = 0;
      let itemCode = '';
      let itemName = '';
      let smallCateCode = '';
      let smallCateName = '';
      newData[key].map((items) => {
        console.log(items);
        qty = items.qty + qty; // 数量;
        totalAmt = items.totalAmt + totalAmt; // 含税金额
        totalCurAmt = items.totalCurAmt + totalCurAmt; // 含税金额本位币
        exclTaxAmt = items.exclTaxAmt + exclTaxAmt; //  不含税金额
        exclTaxCurAmt = items.exclTaxCurAmt + exclTaxCurAmt; //  不含税金额本位币
        taxAmt = items.taxAmt + taxAmt; //  税额
        taxCurAmt = items.taxCurAmt + taxCurAmt; //  税额本位币
        itemCode = items.itemCode.itemCode || items.itemCode; //spuCode
        itemName = items.itemCode.spuName || items.itemName;
        smallCateCode = items.itemSource || items.smallCateCode;
        smallCateName = items.itemSourceName || items.smallCateName;
      });
      console.log(' newData[key]', newData[key]);
      newData[key] = {
        ...newData[key][0],
        qty,
        totalAmt,
        totalCurAmt,
        exclTaxAmt,
        exclTaxCurAmt,
        taxAmt,
        taxCurAmt,
        itemCode,
        itemName,
        smallCateCode,
        smallCateName
      };
      // 对象转成数组
      newArrData.push(newData[key]);
    }

    // console.log(newArrData);
    // 清空并实时创建
    await this.state.getDetailTableRef.clearRows();
    await this.state.getDetailTableRef.addRows(newArrData);
    await this.forDataArr(newArrData);
    return newArrData;
  };
  效果就是下边的图样,实时汇总和更新(就要删除和新增表格。)

在这里插入图片描述
只不过这样做存在有一定的缺陷,但是 效果有了。

例子

var a = [
		{
		BondKey: "010221.IB",
		BondName: "01国开21",
		amount:2000
		},
		{
		BondKey: "010221.IB",
		BondName: "01国开21",
		amount:2000
		},
		{
		BondKey: "011800642.IB",
		BondName: "18珠海港SCP002",
		amount:2000
		}
	]
console.log(a);
 
function mergeObject( array ) {
    var arrayFilted = [];
    array.forEach(function (value,key) {
      //判断过滤后的数组是否为空
      if ( arrayFilted.length == 0 ) {
        arrayFilted.push(value);
      }else{
        arrayFilted.forEach( function (valueIndex,keyIndex) {
          if (valueIndex.BondKey && valueIndex.BondKey !== value.BondKey) {
            arrayFilted.push(value);
          }else if (valueIndex.BondKey && valueIndex.BondKey === value.BondKey) {
            valueIndex.amount = valueIndex.amount + value.amount;
          }
        });
      }
    });
    return arrayFilted;
}
console.log(mergeObject(a));

这样就把3条数据柔和到一条里面去了。在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值