js数组对象根据多个属性值排序

写逻辑的过程中,你会发现,基础的方法特别重要,数组的方法和对象的方法,一定得特别熟悉,这在前端开发中很重要!!
首先,我直接给出多属性值排序的方法,再说下一个详细的真实案例

例如:将下列数组按照pxId排序,当pxId相等时按照dj排序

var arr1 = [
	{ID: "4001104",pxId: 2001,dj: 1,bh: 4001104},
	{ID: "4001105",pxId: 2005,dj: 1,bh: 4001105},
	{ID: "4010102",pxId: 2001,dj: 10,bh: 4010102},
	{ID: "4010103",pxId: 2005,dj: 10,bh: 4010103},
	{ID: "4010104",pxId: 2001,dj: 10,bh: 4010104},
	{ID: "4001102",pxId: 2001,dj: 1,bh: 4001102},
	{ID: "4001103",pxId: 2002,dj: 1,bh: 4001103},
	{ID: "4001106",pxId: 2003,dj: 1,bh: 4001106},
	{ID: "4001101",pxId: 2001,dj: 2,bh: 4001101},
	{ID: "4010101",pxId: 2001,dj: 10,bh: 4010101}
];
arr1.sort(function(a, b) {  
	if(a["pxId"] === b["pxId"]) {    
		if(a["dj"] > b["dj"]) {      
			return 1;    
		} else if(a["dj"] < b["dj"]) {      
			return -1;    
		} else {      
			return 0;    
		}  
	} else {    
		if(a["pxId"] > b["pxId"]) {      
			return 1;    
		} else {      
			return -1;    
		}  
	}
})
console.log(arr1);

注:参考:https://blog.csdn.net/weixin_43358852/article/details/82970007

我们的需求是,首先快速录入一堆数据,这些数据可在表格中更改,然后传给后台的时候,自动排好序,按照款号相同的放一起,尺码相同的放一起。

  1. 快速录入解析数据
    在这里插入图片描述
    固定格式,按照换行和空格去解析数据
var context = $('#input_context').val()||'';
var temp = context.split(/[\r\n,]/g);//换行分割数组,数据分条
var productArr = [];
for(var i=0; i<temp.length; i++){
  var arr = $.trim(temp[i]).split(/\s+/); //空格分割数据,获取每个字段值(尺码,队号,姓名)
  var p_size = arr[0] ? arr[0].toUpperCase() : '';
  var p_team_num = arr[1] ? arr[1] : '';
  var p_name = '';
  if(arr.length>3){ //姓名可以加空格,除了前两个,后面的值都属于姓名部分
      arr.splice(0,2);
      p_name = arr.join(' ');
  }else{
      p_name = arr[2] ? arr[2] : '';
  }
  if(p_size){//尺码是必填项
  		//格式化尺码,XXL -> 2XL XXXL->3XL
      var p_size_arr = p_size.split('X'); 
      var num = p_size_arr.length-1;
      var model = p_size_arr.pop();
      if(num > 1){
          p_size = num + 'X' + model;
      }
      productArr.push({
          p_name: p_name,
          p_size: p_size,
          p_team_num: p_team_num
      });
      addTrFnc({
           p_model: '',
           p_color: '',
           p_name: p_name,
           p_team_name: '',
           p_size: p_size,
           p_team_num: p_team_num,
           // p_price: '',
           p_remark: ''
       })
  }
}
console.log(productArr)

function addTrFnc(obj){
   /*生成序号*/
  var arr_xuhao = $('#Tbody .serialnumd');
  var order_num = arr_xuhao.length + 1;
  // if (order_num > 25) {
  //     $('#modal-tip').show();
  //     $('#modal-tip .tip-content').html('最多支持25条');
  //     return false;
  // }
  /*生成tr*/
  var $tr =`<tr class="parenttr">
          <td class="serialnumd" style="width: 30px">${order_num}</td>
          <td class="operatetd"><a class="goods_del">删除</a></td>
          <td><input type="text" name="p_model" value="${obj.p_model}"/></td>
          <td><input type="text" name="p_color" value="${obj.p_color}"/></td>
          <td><input type="text" name="p_size" value="${obj.p_size}"/></td>
          <td><input type="text" name="p_name" value="${obj.p_name}"/></td>
          <td><input type="text" name="p_team_num" value="${obj.p_team_num}"/></td>
          <td><input type="text" name="p_team_name" value="${obj.p_team_name}"/></td>
          <td><input type="text" name="p_remark" value="${obj.p_remark}"/></td>
      </tr>`;
  $('.goodslist').append($tr);
}

解析完以后,循坏添加元素插入表格,表格td里面直接放input,可直接修改数据信息,取的时候循环tr去拿input值

  1. 排序
    最后传给后台的时候,获取这些商品信息,并按照款号和尺码排列
    在这里插入图片描述
/* 获取定制商品信息数据 */
function getCustomData(){
  var trs = $('#Tbody tr');
  $.each(trs , function(i) {
      var $this = $(this);
      var p_model = $this.find('input[name=p_model]').val();
      var p_color = $this.find('input[name=p_color]').val();
      var p_size = $this.find('input[name=p_size]').val();
      customData.push({
          p_model: p_model,
          p_color: p_color,
          p_size: p_size,
          p_name: $this.find('input[name=p_name]').val(),
          p_team_num: $this.find('input[name=p_team_num]').val(),
          p_team_name: $this.find('input[name=p_team_name]').val(),
          // p_price: $this.find('input[name=p_price]').val(),
          p_remark: $this.find('input[name=p_remark]').val()
      })
  });
  customData.sort(function(a, b) {  
      if(a["p_model"] === b["p_model"]) {    
          if(a["p_size"] > b["p_size"]) {      
              return 1;    
          } else if(a["p_size"] < b["p_size"]) {      
              return -1;    
          } else {      
              return 0;    
          }  
      } else {    
          if(a["p_model"] > b["p_model"]) {      
              return 1;    
          } else {      
              return -1;    
          }  
      }
  })
  return customData;
}

sort方法解析

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值