【问题标题】:How do i multiple sort an array per column for all lines ? (JavaScript)如何对所有行的每列数组进行多次排序? (JavaScript)
【发布时间】:2019-05-26 03:25:37
【问题描述】:

我创建了一个 var rows 来生成一个 csv。 我想根据 2 列对内容进行排序:日期和时间。

DATE;TIME;ID;FACE;TOTAL;VAL1;VAL2;
07/05/2019;14:11:07;3234;0.00000038;2.00;-0.00000038;0;
07/05/2019;**16:11:07**;1779;0.00000019;2.00;-0.00000019;0;
07/05/2019;14:11:06;4120;0.00000304;2.00;0.00000304;1;
26/05/2019;**06:32:39**;2167;0.00000015;2.00;-0.00000015;0;
26/05/2019;06:32:38;5152;0.00000015;2.00;0.00000015;1;
**07/05/2019**;14:11:18;7949;0.00000038;2.00;-0.00000038;0;

预期结果:

DATE;TIME;ID;FACE;TOTAL;VAL1;VAL2;
07/05/2019;14:11:06;4120;0.00000304;2.00;0.00000304;1;
07/05/2019;14:11:07;3234;0.00000038;2.00;-0.00000038;0;
07/05/2019;14:11:18;7949;0.00000038;2.00;-0.00000038;0;
07/05/2019;16:11:07;1779;0.00000019;2.00;-0.00000019;0;
26/05/2019;06:32:38;2167;0.00000015;2.00;-0.00000015;0;
26/05/2019;06:32:39;5152;0.00000015;2.00;0.00000015;1;
var lines = rows.split('\n');
for(var loop = 0; loop < lines.length; loop++){
if (parseFloat(prev) > 0){val2= 1;}else {val2 = 0;}
(....)
lines[loop] = lines[loop].replace(/(\r\n|\n|\r|\s+)/gm,"").trim() + val1 + ";" + val2 + ";";
}
rows = lines.join('\n');

因为使用我的数组行很复杂,我正在考虑使用索引数组属性。但是lines不被认为是一个数组,所以forEach是不可用的。

var result = lines.reduce(function(r, a) {
        a.forEach(function(s, i) {
        var key = i === 0 ? 'headers' : 'col' + i;              
        r[key] || (r[key] = []); 
        r[key].push(s);
        });
        return r;
        }, {});

function compare(r,x,col) {
    if (r[x].col< r[x+1].col) return -1;
    if (r[x].col > r[x+1].col) return 1;
    return 0;
}
for(var loop = 0; loop < r.length; loop++){
        result.sort(compare(r,loop,col1));
        result.sort(compare(r,loop,col2));
}

如何应用双重排序标准并按预期获取此数组中的行?

我的代码用于谷歌浏览器。原型等一些功能不起作用(或过滤......)

【问题讨论】:

    标签: javascript arrays sorting arraylist


    【解决方案1】:

    你可以这样做:

    const data = "07/05/2019;14:11:07;3234;0.00000038;2.00;-0.00000038;0;\n07/05/2019;16:11:07;1779;0.00000019;2.00;-0.00000019;0;\n07/05/2019;14:11:06;4120;0.00000304;2.00;0.00000304;1;\n26/05/2019;06:32:39;2167;0.00000015;2.00;-0.00000015;0;\n26/05/2019;06:32:38;5152;0.00000015;2.00;0.00000015;1;\n07/05/2019;14:11:18;7949;0.00000038;2.00;-0.00000038;0;"
    
    // Convert to array of arrays
    let dataArrays = data.split('\n').map(x => x.split(';'))
    
    let extractDate = arr => {
      let dateParts = arr[0].split('/') // get the date parts array
      let [dd,mm,yyyy] = dateParts     // get the actual dd/mm/yyyy
      let [date, time] = arr          // we only care about the date time for the date
      return new Date(`${mm}/${dd}/${yyyy} ${time}`) // return valid date for the sort
    }
    
    // perform the actual sort 
    let result = dataArrays.sort((a,b) => extractDate(a) - extractDate(b))
    
    console.log(result.map(x => x.join(';')).join('\n')) // join back to same format

    想法是将dd/mm/yyyy 转换为每行的有效日期,然后使用Array.sort 对行进行排序。对行进行排序后,您可以通过Array.join 等转换回一个字符串。

    【讨论】:

    • Woaaa,惊人的结果,完美运行,非常感谢!只是一件事,我怎样才能再次获得“;”每个字段之间? 26/05/2019;06:32:38;5152;0.00000015;2.00;0.00000015;1; ?
    • 更新了最后一个map 以添加`;'。
    猜你喜欢
    • 1970-01-01
    • 2014-01-21
    • 2011-08-31
    • 2011-10-23
    • 2022-01-18
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多