1. 程式人生 > >另一種表格多行合併實現程式碼

另一種表格多行合併實現程式碼

<!DOCcargoName html />
<html>
<head>
    <title>test table</title>
</head>
<body>
    <table id="testTable" border="1" cellspacing="1" cellpadding="1"></table>
</body>
</html>
<script cargoName="text/javascript">

	/*
	 *思路:
	 * 1、根據需要合併的欄位的先後順序對資料進行排序(這裡需要注意點:a、只針對需要合併的欄位;b、合併欄位有向後順序(這個順序類似sql中的"order by truckPlate,cargoName"))
	 * 2、對排序好的資料進行合併:按需要合併的欄位順序先後對行資料對應欄位進行處理
	 * 3、此處都採用的遞迴的方式實現上面兩個步驟。
	 * 4、對行進行顏色處理。(可省略)
	 */
	
	
    let list = [
 
    {
      "childPlanId": "1",
      "partnerName": "電力公司",
      "orderFormNo": "9999089",
      "cargosName": null,
      "carrier": "通宇物流",
      "orderWeight": null,
      "beginMtmsAreaName": "123",
      "endMtmsAreaName": "123",
      "oceanShipName": "123",
      "shipmentTotal": "11",
      "stockTotal": null,
      "endArrivalTotal": null,
      "endTransportTotal": "0",
      "portList": [
        {
          "childPlanId": "1",
          "areaCode": "001002002",
          "stockPortTotal": "11",
          "arrivalPortTotal": null,
          "transportPortTotal": "0",
          "shipmentPortTotal": null,
          "wtlist": [
            {
              "childPlanId": "1",
              "shipName": "黑珍珠",
              "cargosWeight": "",
              "transportWTTotal": null,
              "beginMtmsAreaName": "",
              "endMtmsAreaName": "",
              "endMtmsAreaCode": "001002002",
              "createTime": null,
              "expectArriveTime": null
            }
          ]
        }
      ]
    },
    {
      "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
      "partnerName": "西遊公司",
      "orderFormNo": "CW0022",
      "cargosName": "高度",
      "carrier": "通宇物流",
      "orderWeight": null,
      "beginMtmsAreaName": "宜賓南",
      "endMtmsAreaName": "長江區域",
      "oceanShipName": "",
      "shipmentTotal": null,
      "stockTotal": "25",
      "endArrivalTotal": null,
      "endTransportTotal": null,
      "portList": [
        {
          "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
          "areaCode": "001010002",
          "stockPortTotal": "100",
          "arrivalPortTotal": null,
          "transportPortTotal": "0",
          "shipmentPortTotal": null,
          "wtlist": [
           
            {
              "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
              "shipName": "師傅號",
              "cargosWeight": "66.0",
              "transportWTTotal": null,
              "beginMtmsAreaName": "渡鋼線低貨位",
              "endMtmsAreaName": "木專線低貨位",
              "endMtmsAreaCode": "001010002",
              "createTime": null,
              "expectArriveTime": null
            },
            {
              "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
              "shipName": "大哥號",
              "cargosWeight": "66.0",
              "transportWTTotal": null,
              "beginMtmsAreaName": "渡鋼線低貨位",
              "endMtmsAreaName": "木專線低貨位",
              "endMtmsAreaCode": "001010002",
              "createTime": null,
              "expectArriveTime": null
            },
            {
              "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
              "shipName": "二哥號",
              "cargosWeight": "66.0",
              "transportWTTotal": null,
              "beginMtmsAreaName": "渡鋼線低貨位",
              "endMtmsAreaName": "木專線低貨位",
              "endMtmsAreaCode": "001010002",
              "createTime": null,
              "expectArriveTime": null
            },
            {
              "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
              "shipName": "三弟號",
              "cargosWeight": "66.0",
              "transportWTTotal": null,
              "beginMtmsAreaName": "渡鋼線低貨位",
              "endMtmsAreaName": "木專線低貨位",
              "endMtmsAreaCode": "001010002",
              "createTime": null,
              "expectArriveTime": null
            },
            {
              "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
              "shipName": "白龍馬號",
              "cargosWeight": "66.0",
              "transportWTTotal": null,
              "beginMtmsAreaName": "渡鋼線低貨位",
              "endMtmsAreaName": "木專線低貨位",
              "endMtmsAreaCode": "001010002",
              "createTime": null,
              "expectArriveTime": null
            }
          ]
        },
        {
          "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
          "areaCode": "003",
          "stockPortTotal": "20",
          "arrivalPortTotal": null,
          "transportPortTotal": "0",
          "shipmentPortTotal": null,
          "wtlist": [
            {
              "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
              "shipName": "白骨精號",
              "cargosWeight": "66.0",
              "transportWTTotal": null,
              "beginMtmsAreaName": "渡鋼線低貨位",
              "endMtmsAreaName": "木專線低貨位",
              "endMtmsAreaCode": "003",
              "createTime": null,
              "expectArriveTime": null
            },
            {
              "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
              "shipName": "蜈蚣精號",
              "cargosWeight": "66.0",
              "transportWTTotal": null,
              "beginMtmsAreaName": "渡鋼線低貨位",
              "endMtmsAreaName": "木專線低貨位",
              "endMtmsAreaCode": "001010002",
              "createTime": null,
              "expectArriveTime": null
            }
          ]
        }
      ]
    },
    {
      "childPlanId": "5f46c90e-6748-4583-bec1-7c7eb188fb3b",
      "partnerName": "湖北豐富公司",
      "orderFormNo": "CW0050",
      "cargosName": "互粉",
      "carrier": "通宇物流",
      "orderWeight": null,
      "beginMtmsAreaName": "攀西區域 攀枝花木專線",
      "endMtmsAreaName": "長江區域 重慶南",
      "oceanShipName": "",
      "shipmentTotal": null,
      "stockTotal": null,
      "endArrivalTotal": null,
      "endTransportTotal": null,
      "portList": []
    },
    {
      "childPlanId": "5f7024f2-867b-4269-b590-96099e8d5e91",
      "partnerName": "客戶",
      "orderFormNo": "CW0013",
      "cargosName": "瓜果|瓜果2",
      "carrier": "通宇物流",
      "orderWeight": null,
      "beginMtmsAreaName": "攀西區域",
      "endMtmsAreaName": "西昌南站",
      "oceanShipName": "海船",
      "shipmentTotal": null,
      "stockTotal": null,
      "endArrivalTotal": null,
      "endTransportTotal": null,
      "portList": [
        {
          "childPlanId": "1",
          "areaCode": "001002002",
          "stockPortTotal": "88",
          "arrivalPortTotal": null,
          "transportPortTotal": "0",
          "shipmentPortTotal": null,
          "wtlist": [
            {
              "childPlanId": "1",
              "shipName": "黑珍珠",
              "cargosWeight": "",
              "transportWTTotal": null,
              "beginMtmsAreaName": "",
              "endMtmsAreaName": "",
              "endMtmsAreaCode": "001002002",
              "createTime": null,
              "expectArriveTime": null
            },
            {
              "childPlanId": "538a491b-8451-4cb9-9928-af2326774ad6",
              "shipName": "蜈蚣精號",
              "cargosWeight": "66.0",
              "transportWTTotal": null,
              "beginMtmsAreaName": "渡鋼線低貨位",
              "endMtmsAreaName": "木專線低貨位",
              "endMtmsAreaCode": "001010002",
              "createTime": null,
              "expectArriveTime": null
            }
          ]
        }
      ]
    },
  ];
	
	
	let dt = list;
	let bodyStr = "";
	
	let spanArr;//兩層,最細的一層永遠span都是一所以不用放進來
	dt.forEach(item => {
		spanArr = [0,0];
		let parentStr = portStr = wtStr = "";

		if(item.portList.length == 0){//只有一層
		
			parentStr = ('<td>' + item.partnerName + '</td>');
			wtStr += ('<tr>'+ parentStr +'<td></td><td></td></tr>');
		}else{
			item.portList.reverse().forEach((portItem,portIndex) =>{//第二層有,第三層肯定有
					
				spanArr[1] = portItem.wtlist.length;
				
				portItem.wtlist.reverse().forEach((wtItem,index) =>{
					spanArr[0]++;
					if(portIndex == (item.portList.length-1) && index == (portItem.wtlist.length-1)) {
						parentStr = ('<td rowspan="' + spanArr[0] + '">' + item.partnerName + '</td>');
						portStr = ('<td rowspan="' + spanArr[1] + '">' + portItem.stockPortTotal + '</td>');

						wtStr = ('<tr>'+ parentStr +'<td>' + wtItem.shipName + '</td>'+portStr+'</tr>') + wtStr;
					
					}else if(index == (portItem.wtlist.length-1)) {
						portStr = ('<td rowspan="' + spanArr[1] + '">' + portItem.stockPortTotal + '</td>');
						
						wtStr = ('<tr><td>' + wtItem.shipName + '</td>'+portStr+'</tr>') + wtStr;
					}else{
						wtStr = ('<tr><td>' + wtItem.shipName + '</td></tr>') + wtStr;
					}
				})	
				
			})
		}
		
		
		
		bodyStr += wtStr
	
	})
	
	
	
	
	   
	//表頭處理
    let ht = '<thead><tr><th>客戶名稱</th><th>江船名</th><th>到港量</th></tr></thead><tbody>' + bodyStr + '</tbody>';

    var tbl = document.getElementById('testTable');
    tbl.innerHTML = ht;
	
	/**
	 * 合併操作結束
	 */
	
	
</script>

<script>

	//顏色處理
	var tbl = document.getElementById('testTable'), firstColor = '#def', secondColor = '#fed';
    for (var i = 1; i < tbl.rows.length; i++) { //遍歷Row,零行是標題行,直接跳過
        tbl.rows[i].style.backgroundColor = (i % 2 == 0) ? firstColor : secondColor;
    }
    var cols = document.getElementsByName('col_1');
    for (var i = 0; i < cols.length; i++) {
        cols[i].style.backgroundColor = (i % 2 == 1) ? firstColor : secondColor;
    }
    cols = document.getElementsByName('col_2');
    for (var i = 0; i < cols.length; i++) {
        cols[i].style.backgroundColor = (i % 2 == 1) ? firstColor : secondColor;
    }

</script>