在Javascript

时间:2016-11-18 04:43:59

标签: javascript arrays sorting pdf acrobat

我是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中编写代码而不是网络。

3 个答案:

答案 0 :(得分:2)

我认为数组中的项目是绑定的。因此,您应该使用[{},{},{},{},{}]而不是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);
})

答案 1 :(得分:1)

鉴于数据:

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);
});

答案 2 :(得分:0)

// 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);