自定义数组怎么关联数据数组实现同步排序,,已解决不知道还能不能优化代码实现在评论中

WEB菜鸟
  • 276

1.自定义数组怎么关联数据数组实现同步排序:

2.这是排序前的数据数组:
[null, null, null, 2015-11-23 15:26:57, 2015-11-23 15:3:23, null, null, 2015-11-23 15:16:8, 2015-11-23 15:26:59, null]

按顺序对应自定义字段名数组:
this.dataNames = ['采样','送检','签收','已登记','IOM','离心','去盖','测试中','已上传','已送检']

3.取数据数组的分钟给数据数组排序后数组效果是这样的:
[0, 0, 0, 0, 0, 0, 3, 16, 26, 26]

4.ECharts中的柱状图字段名数组和数据数组插入只能分开插入:
yAxis: {

        type: 'category',
        data: this.dataNames,

        axisTick: {
            alignWithLabel: true,
        }
    },
    series: [
        {
            name: '2011年',
            type: 'bar',
            data:  this._rowsData
        }
    ]
    
    

5.问题:我怎么实现自定义的字段名数组跟随数值数组同步排序????
这是交互模块源码:
// 交互模塊
SampleTime.prototype.getSampleStateBySampleNo = function (){

//直接调用Procedure存储过程
var Request = Global.NewMessage();
//console.log(Request)
Request.ProcedureName = "[proc_datalink_getsample_module]";
Request.ParameterNames = ["SampleNo"];
Request.ParameterDataTypes = ["int"];
Request.ParameterValues = [1];


//获取数据
//PostMessage 异步需回调
var Return = Global.SendMessage("DB_CallProcedure", Request);
var Returns =  Return.Table0;
console.log(Returns)
//获取值
this._rowsData = [];
this._rowsData = Returns._rowsData[0];
var datas = [];
var times = [];
for (var data=0;data<this._rowsData.length;data++){
    times.push(this._rowsData[data]);
    datas.push(new Date(this._rowsData[data]).getMinutes());
}

//排序,格式化分钟
var compare = function (x,y) {//比较函数
    if (x < y) {
        return -1;
    } else if (x > y) {
        return 1;
    } else {
        return 0;
    }
}
datas.sort(compare);
this._rowsData = datas;
console.log(this._rowsData)
//完整时间
this._rowsDatas = times;



//自定义字段名
this.dataNames = ['采样','送检','签收','已登记',
    'IOM','离心','去盖','测试中','已上传','已送检']

}
SampleTime.prototype.getSampleStateBySampleNo();

6.这是后台的数据格式:
图片描述

7.这是效果图,由0开始如果排序正确的话应该是3,4,7,8有数据,自定义字段对应的应该是:已登记,IOM,测试中,已上传这几项有值,但是现在目前貌似所有效果都是值对应上了最后4项字段名:
图片描述

回复
阅读 1.8k
4 个回答
WEB菜鸟
  • 276
✓ 已被采纳

谢谢大家,我解决了思路是二维数组排序,我把我实现代码贴出来,谢谢帮助我的朋友们:
1.交互模块:

// 交互模塊
SampleTime.prototype.getSampleStateBySampleNo = function () {

//直接调用Procedure存储过程
var Request = Global.NewMessage();
Request.ProcedureName = "[proc_datalink_getsample_module]";
Request.ParameterNames = ["SampleNo"];
Request.ParameterDataTypes = ["int"];
Request.ParameterValues = [1];
//获取数据
//PostMessage 异步需回调
var Return = Global.SendMessage("DB_CallProcedure", Request);
var Returns = Return.Table0;
console.log(Returns)
// //获取值
this._rowsData = [];
this._rowsData = Returns._rowsData[0];
var datas = [];
var times = [];
for (var data = 0; data < this._rowsData.length; data++) {
    times.push(this._rowsData[data]);
    datas.push(new Date(this._rowsData[data]).getMinutes());
}
this._rowsData = datas;
console.log(this._rowsData)

//自定义数组:["采样","送检","签收","已登记","IOM","离心","去盖","测试中","已上传","已送检"]
//混合数组
this.dataValues = [
    ["采样",this._rowsData[0]],
    ["送检",this._rowsData[1]],
    ["签收",this._rowsData[2]],
    ["已登记",this._rowsData[3]],
    ["IOM",this._rowsData[4]],
    ["离心",this._rowsData[5]],
    ["去盖",this._rowsData[6]],
    ["测试中",this._rowsData[7]],
    ["已上传",this._rowsData[8]],
    ["已送检",this._rowsData[9]]
]
console.log(this.dataValues)
//给二维数组第二列排序
this.dataValues.sort(function(a,b){
    return a[1]-b[1];
});

this._values = [];
this._datas = [];
for(var i=0;i<this.dataValues.length;i++){
    this._values.push(this.dataValues[i][0]);
    this._datas.push(this.dataValues[i][1]);
}



2.ECharts插入代码:

yAxis: {

        type: 'category',
        data: this._values ,
        axisTick: {
            alignWithLabel: true,
        }
    },
    series: [
        {
            name: '2011年',
            type: 'bar',
            data: this._datas,
        }
dablwow80
  • 4.9k

存成对象数组

[
    {
        date,
        type,
    }
]

然后对数组中的date排序,最后分成两个数组

补充一下。实际应用还要考虑其他因素,比如后端返回的数据情况,数据的量级,代码的可读性和可维护性等。

=================

根据你的代码做的修改,你中间有些步骤写的有点冗余我改了下
ES5:

var dateData = this._rowsData = [null, null, null, '2015-11-23 15:26:57', '2015-11-23 15:3:23', null, null, '2015-11-23 15:16:8', '2015-11-23 15:26:59', null]
var typeData = this.dataNames = ['采样', '送检', '签收', '已登记',
  'IOM', '离心', '去盖', '测试中', '已上传', '已送检'
]

var result = this.dataNames
  .map(function (type, index) {               // 拼对象数组
    return {
      type,
      date: new Date(dateData[index]).getMinutes(),
    }
  })
  .sort(function (a, b) {                     // 排序

    // sort 不稳定
    if (a.type === null && b.type === null) {
      return typeData.indexOf(a.type) - typeData.indexOf(b.type)
    }
    return new Date(a.date) - new Date(b.date)
  })
  .reduce(function (result, item) {           // 分割对象数组为两个数组
    return {
      date: result.date.concat(item.date),
      type: result.type.concat(item.type),
    }
  }, { date: [], type: [] })

var date = result.date;
var type = result.type;

console.log(date, type)
// [0, 0, 0, 0, 0, 0, 3, 16, 26, 26]
// ["采样", "送检", "签收", "离心", "去盖", "已送检", "IOM", "测试中", "已登记", "已上传"]

ES6:

const dateData = this._rowsData = [null, null, null, '2015-11-23 15:26:57', '2015-11-23 15:3:23', null, null, '2015-11-23 15:16:8', '2015-11-23 15:26:59', null]
const typeData = this.dataNames = ['采样', '送检', '签收', '已登记',
  'IOM', '离心', '去盖', '测试中', '已上传', '已送检'
]

const { date, type } = this.dataNames
  .map((type, index) => ({ type, date: new Date(this._rowsData[index]).getMinutes() })) // 拼对象数组
  .sort(({ date: dateA, type: typeA }, { date: dateB, type: typeB }) =>                 // 排序

  // sort不稳定
    (typeA === null && typeB === null)
      ? typeData.indexOf(typeA) - typeData.indexOf(typeB)
      : new Date(dateA) - new Date(dateB))
  .reduce((result, { date, type }) => ({                                                // 分割对象数组为两个数组
    date: [...result.date, date],
    type: [...result.type, type]
  }), { date: [], type: [] })

console.log(date, type)
// [0, 0, 0, 0, 0, 0, 3, 16, 26, 26]
// ["采样", "送检", "签收", "离心", "去盖", "已送检", "IOM", "测试中", "已登记", "已上传"]

其实我看了半天,没有理解你要想问什么,特别是你所谓的“自定义的字段名数组跟随数值数组同步排序” 到底是什么,即你应该以数据表达你排序前的情况和排序后的情况,以及排序的依据。

var dateData1 = [null, null, null, '2015-11-23 15:26:57', '2015-11-23 15:3:23', null, null, '2015-11-23 15:16:8', '2015-11-23 15:26:59', null]
        var typeData1 = ['采样', '送检', '签收', '已登记',
            'IOM', '离心', '去盖', '测试中', '已上传', '已送检'
        ];

        var dateData1IndexObj=new Array(dateData1.length);
        var resultData={
            date:[],
            type:[]
        };
        dateData1.forEach(function(item,index){
            dateData1IndexObj[index]={
                minutes:item?new Date(item).getMinutes():0,
                index:index
            };
        });

        dateData1IndexObj.sort(function(itemA,itemB){
            if(itemA.minutes<itemB.minutes){
                return -1;
            }else if(itemA.minutes>itemB.minutes){
                return 1;
            }else{
                return 0;
            }

        });

        dateData1IndexObj.forEach(function(item,index){
            console.log(typeData1[item.index]);
            resultData.date.push(item.minutes);
            resultData.type.push(typeData1[item.index]);
        });

        console.log(resultData);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进