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