对 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);
我是 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);