对象的数组列表的Javascript排序列表-基于特定的数组列表
Javascript sorting list of arraylist of object - based on specfic arraylist
如果我有Javascript对象:
var myObject = {
dataset : [],
};
myObject.dataset.push({data : [1,5,4,6]});
myObject.dataset.push({data : [2,4,7,4]});
myObject.dataset.push({data : [12,53,4,45]});
然后我想对ALL数据集进行排序。数据但仅基于特定数据集。fx第一个myObject.dataset[0].data
预期结果:
0 : ({data : [1,4,5,6]}); // sorted list
1 : ({data : [2,7,4,4]}); // others match the changes.
2 : ({data : [12,4,53,45]});
类似于:
for(i = 0; i < myObject.dataset.length; i++) {
myObject.dataset[i].data.sort( BASED ON myObject.dataset[0].data )
}
小提琴:https://jsfiddle.net/Lc7bn7hq/
这样就可以了。我添加了注释来显示正在发生的事情…
var something = {
dataset: [],
};
something.dataset.unshift({data : [1,5,4,6]});
something.dataset.unshift({data : [1,5,8,6]});
something.dataset.unshift({data : [2,4,7,4]});
something.dataset.unshift({data : [12,53,4,45]});
something.dataset.unshift({data : [11,52,41,16]});
something.dataset.unshift({data : [1,53,43,64]});
something.dataset.unshift({data : [1,5,8,6,3]});
//This function is used when sorting two cells in an array
//See the Array.prototype.sort method on MDN for more info
//Returning -1 keeps (a,b)->(a,b), returning 1 swaps (a,b)->(b,a)
var asc = function(a,b) {return a<b?-1:1; };
//Sort the whole dataset, based on the values of each array
something.dataset.sort(function(a,b) {
//The arguments a and b are cell objects in something.dataset
//Sort each of the data arrays for the objects
a.data.sort(asc);
b.data.sort(asc);
//Tricky part is if a.data[0] and b.data[0] are equal
//Find the first cell of both arrays that are not equal
var i=0;
var al = a.data.length;
var bl = b.data.length
var l=Math.min(al,bl);
while(i<l && a.data[i]===b.data[i]) i++;
//All the values for the shortest of both arrays are equal! Sort by the length of the arrays instead
if(i>=l) return asc(al,bl);
//We found a non-equal cell in both arrays, sort by it!
return asc(a.data[i],b.data[i]);
});
console.log(JSON.stringify(something));
此解决方案将数据重组为一个新的数组,对其进行排序并将数据移回:
var regrouped=[];
for (var i=0; i<myObject.dataset[0].data.length; i++) {
regrouped.push([]);
}
for (var j=0; j<myObject.dataset[0].data.length; j++) {
for (i=0; i<myObject.dataset.length; i++) {
regrouped[j][i]=myObject.dataset[i].data[j];
}
}
regrouped.sort(function(a,b){return a[0]-b[0];});
for (i=0; i<myObject.dataset.length; i++) {
for (j=0; j<myObject.dataset[0].data.length; j++) {
myObject.dataset[i].data[j]=regrouped[j][i];
}
}
如果你对使用lodash或下划线js库持开放态度。你可以使用这个lodash函数非常简单优雅地实现你想要的。
var something = {
dataset: [],
};
something.dataset.unshift({data : [1,5,4,6]});
something.dataset.unshift({data : [2,4,7,4]});
something.dataset.unshift({data : [12,53,4,45]});
something.dataset.unshift({data : [11,52,41,16]});
something.dataset.unshift({data : [1,53,43,64]});
_.forEach(something.dataset, function(data){
console.log(data.data);
data.data = _.sortBy(data.data);
});
console.log(something);
相关文章:
- 用每小时的差值填充数组/列表-从下拉列表中给定两个时间值
- 使用图像数组列表的simplegallary.js显示适合桌面屏幕的图像
- 从多维嵌套json数组创建下拉列表
- 如何发送分配列表<字符串>到JavaScript数组或可枚举对象
- Jquery 读取编号组中选择下拉列表的数组
- 如何从 URL 数组向文档添加图像列表
- 为对象数组创建列表项
- 从javascript中的数组列表中获取值
- 从select创建项目列表/数组
- 列表/数组的迭代问题
- 列表/数组是否有效 JSON
- 如何在C# MVC的VIew中将列表数组拆分为单独的数组
- 对列表/数组中的每个项目运行相同的函数
- 需要 JQuery 标记从数据库的列表/数组中选中的复选框
- javascript indexOf - 列表/数组中的完全匹配
- PHP 从现有代码中随机化文件列表数组
- 使用自定义函数从字典中创建列表/数组
- 检查元素是否具有在列表/数组中给定的类
- html中的下拉列表数组
- 如何在javascript中读取对象文件列表数组