对 Javascript 中的数组、变量或对象进行排序

Sort arrays, variables or objects in Javascript

我是 javascript 的新手,但我已经编写了一些脚本,这些脚本确实对我的工作流程产生了影响。然而,我现在着手进行一个项目,该项目迫使我以一种我在 Javascript 中不知道如何做的方式对数据进行排序。我将尝试解释我需要做什么,就好像我的数据在 excel 中一样,但事实并非如此,我只能将数据放在 4 个不同的数组中:

 pagenumber[1,2,3,4,5] //only numbers
 zipcode[77889,99887,33667,11122,44559] // only numbers
 streetname[Hillroad, Hillroad, Baghdad Street, Hongway, Chinatown] //only letters
 roadnumber[55,27,1,13,16] //only numbers

我想这样排序,首先按邮政编码,然后按路名,然后按偶数路号降序,然后按奇数路号升序。 根据这个新的排序,我想生成一个新的页码,但我希望它以某种方式与(旧)变量 "pagenumber" 相关,这样我就可以找到旧页面并将其提取到具有新页码的新文档中。我不是要你们为我写所有的代码,但我需要一些建议,首先要知道是否可以按照我的想法去做,其次我是否可以将数据放在四个不同的位置数组,第三,如果有任何(当然)更聪明的方法来保存数据,以便它们更紧密地相互关联。给我你的想法。还感谢我应该阅读的位置和内容的提示。谢谢大家的回答。但是我想指出,我在 Acrobat DC 中编写我的代码不是为了网络。

我想你数组中的项目是绑定的。所以你应该使用 [{},{},{},{},{}] 而不是 4 个数组。 var items = [{pagenumber:1,zipcode:77889,streetname:Hillroad,roadnumber:55},{...},{...},{...},{...}] 然后将每个键值 属性 逐一排序,如下所示:

var x= [ {a:2,b:2,c:3}, {a:1,b:1,c:1}, {a:1,b:2,c:3}, {a:2,b:2,c:2} ];

x.sort(function(item1, item2){ 
    var sort_a = item1.a-item2.a;
    if (sort_a) return sort_a;
    var sort_b = item1.b-item2.b;
    if (sort_b) return sort_b;
    var sort_c = item1.c-item2.c;
    if (sort_c) return sort_c;
})

或者简化为

x.sort(function(item1, item2){ 
    return (item1.a-item2.a) || (item1.b-item2.b) || (item1.c-item2.c);
})

给定数据:

var pagenumber=[1,2,3,4,5]; //only numbers
var zipcode=[77889,99887,33667,11122,44559]; // only numbers
var streetname=['Hillroad', 'Hillroad', 'Baghdad Street', 'Hongway', 'Chinatown']; //only letters
var roadnumber=[55,27,1,13,16]; //only numbers

首先,您需要使数据更易于管理

var data = pagenumber.map(function(itemValue, index) {
    return {
        pagenumber:itemValue, // == pagenumber[index]
        zipcode:zipcode[index],
        streetname:streetname[index],
        roadnumber:roadnumber[index]
    };
});

然后排序

data.sort(function(a, b) {
     if (a.zipzode != b.zipcode) {
         // numeric
         return a.zipcode - b.zipcode;
     }
     if (a.streetname != b.streetname) {
         // alpha
         return a.streetname < b.streetname ? -1 : a.streetname > b.streetname ? 1 : 0;
     }
     if (a.roadnumber % 2 != b.roadnumber % 2) {
         // even before odd
         return b.roadnumber % 2 - a.roadnumber % 2;
     }
     // numeric
     return a.roadnumber - b.roadnumber;
});

借用另一个答案,可以简化为

data.sort(function(a, b) {
    return  (a.zipcode - b.zipcode) || (a.streetname < b.streetname ? -1 : a.streetname > b.streetname ? 1 : 0) || (b.roadnumber % 2 - a.roadnumber % 2) || (a.roadnumber - b.roadnumber);
});

就我个人而言,我不会在可以避免的情况下使用中间步骤...因此以下等效于在一个链接命令中自动执行映射和排序

var sortedData = pagenumber.map(function(itemValue, index) {
    return {
        pagenumber:itemValue, 
        zipcode:zipcode[index],
        streetname:streetname[index],
        roadnumber:roadnumber[index]
    };
}).sort(function(a, b) {
    return  (a.zipcode - b.zipcode) || (a.streetname < b.streetname ? -1 : a.streetname > b.streetname ? 1 : 0) || (b.roadnumber % 2 - a.roadnumber % 2) || (a.roadnumber - b.roadnumber);
});
// sorting zipcode in ascending order
zipcode.sort();
// sorting streetname in ascending order
streetname.sort();
// fetching evenroad numbers
var roadnumbereven=roadnumber.filter(function(element, index, array) {
  return (element % 2 === 0);
});
// fetching odd roadnumbers
var roadnumberodd = roadnumber.filter(function(element, index, array) {
  return (element % 2 !== 0);
});
// sorting even road numbers in ascending order
roadnumbereven.sort();
// sorting odd road numbers in descending order
roadnumberodd.sort(function(a,b){ return b-a; });
// merging roadnumbers(even/odd)
roadnumber = roadnumbereven.concat(roadnumberodd);


console.log(roadnumber);