按两个不同的值对 JavaScript 对象数组进行排序
Sorting JavaScript Array Of Objects by two different values
我在JavaScript中有一个这样的对象:
myArray[0] -> 0:"62", 1:8, 2:0, 3:"11"
myArray[1] -> 0:"62", 1:8, 2:0, 3:"15"
myArray[2] -> 0:"48", 1:8, 2:0, 3:"04"
myArray[3] -> 0:"48", 1:8, 2:0, 3:"01"
myArray[4] -> 0:"62", 1:8, 2:0, 3:"12"
myArray[5] -> 0:"48", 1:8, 2:0, 3:"02"
myArray[6] -> 0:"62", 1:8, 2:0, 3:"14"
myArray[7] -> 0:"48", 1:8, 2:0, 3:"03"
我试图让它变成这样:
myArray[0] -> 0:"48", 1:8, 2:0, 3:"01"
myArray[1] -> 0:"48", 1:8, 2:0, 3:"02"
myArray[2] -> 0:"48", 1:8, 2:0, 3:"03"
myArray[3] -> 0:"48", 1:8, 2:0, 3:"04"
myArray[4] -> 0:"62", 1:8, 2:0, 3:"11"
myArray[5] -> 0:"62", 1:8, 2:0, 3:"12"
myArray[6] -> 0:"62", 1:8, 2:0, 3:"14"
myArray[7] -> 0:"62", 1:8, 2:0, 3:"15"
如您所见,我首先尝试按myArray[i][0]
对其进行排序,然后根据myArray[i][0]
作为索引按myArray[i][3]
排序。我设法使用 myArray[i][0]
进行排序
myObject.sort(function(a, b){
return parseInt(a) - parseInt(b);
});
如何在没有库的情况下完成此操作?
我建议使用链接的比较函数在一次运行中进行排序。
Array#sort() 如何工作:
如果提供了
compareFunction
,则根据比较函数的返回值对数组元素进行排序。如果a
和b
是要比较的两个元素,则:
如果
compareFunction(a, b)
小于 0,则对 a 进行排序,使其索引低于 b,即 a 排在第一位。如果
compareFunction(a, b)
返回 0,则保持a
和b
彼此不变,但相对于所有不同的元素进行排序。注意:ECMAscript 标准不保证这种行为,因此并非所有浏览器(例如至少可追溯到 2003 年的 Mozilla 版本)都尊重这一点。- 如果
compareFunction(a, b)
大于 0,则b
排序为低于a
的索引。- 当给定一对特定的元素 a 和 b 作为其两个参数时,
compareFunction(a, b)
必须始终返回相同的值。如果返回不一致的结果,则未定义排序顺序。
在这种情况下,比较函数有两个组,一个用于对索引[0]
进行排序,一个用于排序索引[3]
。如果索引 [0]
处的值相等,则采用索引[3]
的排序。两个组都用逻辑或||
var array = [["62", 8, 0, "11"], ["62", 8, 0, "15"], ["48", 8, 0, "04"], ["48", 8, 0, "01"], ["62", 8, 0, "12"], ["48", 8, 0, "02"], ["62", 8, 0, "14"], ["48", 8, 0, "03"]];
array.sort(function (a, b) {
return a[0].localeCompare(b[0]) || a[3].localeCompare(b[3]);
});
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');
对我来说,
你的变量看起来像一个Array
(用整数键索引的对象),所以,如果是这样的话,怎么样:
var ar = [
["62", 8, 0, "11"],
["62", 8, 0, "15"],
["48", 8, 0, "04"],
["48", 8, 0, "01"],
["62", 8, 0, "12"],
["48", 8, 0, "02"],
["62", 8, 0, "14"],
["48", 8, 0, "03"]
]
var result = ar.map(function(a) {
return {key: a.join(''), val: a}
}).sort(function(a, b){
return parseInt(a.key, 10) - parseInt(b.key, 10);
}).map(function(a) {
return a.val
})
console.log(result)
看到这个小提琴
编辑
Object
版本:
var data = [{ 0:"62", 1:8, 2:0, 3:"11"},{ 0:"62", 1:8, 2:0, 3:"15"},
{ 0:"48", 1:8, 2:0, 3:"04"},{ 0:"48", 1:8, 2:0, 3:"01"},
{ 0:"62", 1:8, 2:0, 3:"12"},{ 0:"48", 1:8, 2:0, 3:"02"},
{ 0:"62", 1:8, 2:0, 3:"14"},{ 0:"48", 1:8, 2:0, 3:"03"}]
var result = data.map(function(a) {
return {key: [0,1,2,3].map(function(k) {return a[k]}).join(''), val: a}
}).sort(function(a, b){
return parseInt(a.key, 10) - parseInt(b.key, 10);
}).map(function(a) {
return a.val
})
console.log(result)
更新的小提琴
编辑 2
在@malixsys的评论之后,这里有一个更有效的方法:
var result = data.sort(function(a, b){
return parseInt(a[0]+ a[1] + a[2] + a[3], 10) - parseInt(b[0]+ b[1] + b[2] + b[3], 10);
})
和相应的更新小提琴
相关文章:
- 面向对象JavaScript中的私有函数
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- 将字符串转换为对象 javascript/jquery
- 正在检查对象javascript中是否存在嵌套属性
- 时间-日期对象JavaScript getUTCMilliseconds
- 仅在对象(javascript)中解析值
- 使用对象(JavaScript或jQuery)填充选择下拉列表
- 引用另一个对象javascript中的对象
- 如何删除列表中的对象?Javascript nodejs和下划线
- 无法从日期对象javascript获取日期和月份
- 如何在if语句中使用对象-Javascript
- 对象javascript错误
- 对象Javascript的少数实例
- 位置对象Javascript
- 将字符串传递到对象javascript中
- 获取对象Javascript或jQuery的最后一个值
- 鼠标接近对象Javascript
- 这个mixins代码是书中的错误吗;面向对象JavaScript的原理”;
- 使用闭包编译器编写更好的面向对象JavaScript完整示例代码
- 访问对象javascript数组中的对象属性值