Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按子属性对对象的javascript数组排序(可能缺少子属性)_Javascript_Arrays_Sorting - Fatal编程技术网

按子属性对对象的javascript数组排序(可能缺少子属性)

按子属性对对象的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 ) {

我有一个很大的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 ) {
            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))
可以工作。