按子属性对对象的javascript数组排序(可能缺少子属性)
我有一个很大的ish数据集(存储在一个数组中的400-4000个对象),我试图通过用户选择的字段来过滤它们 现在我正在使用这个函数,在另一个SO问题上发现:按子属性对对象的javascript数组排序(可能缺少子属性),javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个很大的ish数据集(存储在一个数组中的400-4000个对象),我试图通过用户选择的字段来过滤它们 现在我正在使用这个函数,在另一个SO问题上发现: var sort = function (prop, arr) { prop = prop.split('.'); var len = prop.length; arr.sort(function (a, b) { var i = 0; while( i < len ) {
var sort = function (prop, arr) {
prop = prop.split('.');
var len = prop.length;
arr.sort(function (a, b) {
var i = 0;
while( i < len ) {
a = a[prop[i]];
b = b[prop[i]];
i++;
}
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
});
return arr;
};
注意“Lucy”没有朋友对象,所以当我运行排序('friends.count',data)时代码>,脚本将中断
理想情况下,我希望将不具有排序依据的属性的对象放在数组的末尾。关于如何实现这一点有什么想法吗?例如
var数据=[
{
名字:“吉姆”,
朋友们:{
计数:20,
网址:'http://foo.com'
}
},{
名字:“露西”,
},{
姓名:'菲尔',
朋友们:{
计数:450,
网址:'http://moo.com'
}
}
];
safeGet=函数(对象、属性、默认值){
试一试{
返回对象[prop]
}捕获(e){
返回默认值
}
}
数据排序(函数(x,y){
返回(
safeGet(x.friends,'count',Infinity)——
safeGet(y.friends,'count',Infinity));
});
document.write(“+JSON.stringify(数据,0,3))代码>例如
var sort = function (prop, arr) {
prop = prop.split('.');
var len = prop.length;
arr.sort(function (a, b) {
var i = 0;
var key;
while( i < len ) {
key = prop[i];
if(!a.hasOwnProperty(key)) return 1;
if(!b.hasOwnProperty(key)) return -1;
a = a[key];
b = b[key];
i++;
}
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
});
return arr;
};
var数据=[
{
名字:“吉姆”,
朋友们:{
计数:20,
网址:'http://foo.com'
}
},{
名字:“露西”,
},{
姓名:'菲尔',
朋友们:{
计数:450,
网址:'http://moo.com'
}
}
];
safeGet=函数(对象、属性、默认值){
试一试{
返回对象[prop]
}捕获(e){
返回默认值
}
}
数据排序(函数(x,y){
返回(
safeGet(x.friends,'count',Infinity)——
safeGet(y.friends,'count',Infinity));
});
document.write(“+JSON.stringify(数据,0,3))代码>可以修改函数以检查是否存在属性:
var sort = function (prop, arr) {
prop = prop.split('.');
var len = prop.length;
arr.sort(function (a, b) {
var i = 0;
var key;
while( i < len ) {
key = prop[i];
if(!a.hasOwnProperty(key)) return 1;
if(!b.hasOwnProperty(key)) return -1;
a = a[key];
b = b[key];
i++;
}
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
});
return arr;
};
var sort=函数(prop,arr){
道具=道具分割('.');
var len=道具长度;
arr.sort(函数(a,b){
var i=0;
var键;
而(我b){
返回1;
}否则{
返回0;
}
});
返回arr;
};
这样它就会起作用。我举了一个例子
@georg的答案无法与动态选择的属性一起使用。可以修改函数以检查属性是否存在:
var sort=函数(prop,arr){
道具=道具分割('.');
var len=道具长度;
arr.sort(函数(a,b){
var i=0;
var键;
而(我b){
返回1;
}否则{
返回0;
}
});
返回arr;
};
这样它就会起作用。我举了一个例子
@georg的答案在动态选择属性时不起作用。样本数组已经排序了,对吗?样本数组已经排序了,对吗?这一个起作用了,除非我尝试按降序排序,将“Lucy”放在第一位。我将if(!a.hasOwnProperty(key))
更改为return-1
,并且它工作了-我假设这是正确的,因为我希望任何不具有该属性的对象都转到数组的末尾。确实,您提到了不具有该属性的元素应该放在末尾。该元素工作了,除非我尝试对其进行降序排序首先是“Lucy”。我将if(!a.hasOwnProperty(key))
更改为return-1
,并且成功了-我假设这是正确的,因为我希望任何不具有该属性的对象都转到数组的末尾。是的,您提到没有该属性的元素应该放在end@zaynetro:这样更干净。如果(obj&&obj.hasOwnProperty(prop))
可以工作。@zayntro:这样比较干净。如果(obj&&obj.hasOwnProperty(prop))
可以工作。