在javascript中对对象的对象数组进行排序

kou*_*tst 5 javascript arrays sorting javascript-objects

我想通过"user"对象中的"name"对下面的数组进行排序

 var myArr = [
 {"id":1,"user":{"name":"allen","id":101}},
 {"id":2,"user":{"name":"martin","id":102}}
]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我有一个方法来排序对象数组,但我不能将它用于对象的数组

这是方法:

function dynamicSort(property) {
    var sortOrder = 1;
    if (property[0] === "-") {
        sortOrder = -1;
        property = property.substr(1);
    }
    return function (a, b) {
            var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0;
        return result * sortOrder;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我可以使用这个排序:

myArr.sort(dynamicSort("id"));
Run Code Online (Sandbox Code Playgroud)

Fra*_*erZ 5

我将创建属性作为一个getter函数(对于复杂的例子.你可以检查propFn是否是一个函数,使用下面的代码来处理更复杂的函数.看看这个答案是为了检查propFn是一个函数.):

var myArr = [
  {"id":1,"user":{"name":"allen","id":101}},
  {"id":2,"user":{"name":"martin","id":102}}
]

function dynamicSort(propFn, sortOrder = 1) {
    return function (a, b) {
        var result = (propFn(a) < propFn(b)) ? -1 : (propFn(a) > propFn(b)) ? 1 : 0;
        return result * sortOrder;
    }
}

console.log(myArr.sort(dynamicSort((obj) => obj.user.name)));
console.log(myArr.sort(dynamicSort((obj) => obj.user.name, -1)));
Run Code Online (Sandbox Code Playgroud)

或者,您可以查看:将点表示法中的JavaScript字符串转换为对象引用

这将让您了解如何将句点符号转换为嵌套对象,但我建议您阅读顶部的免责声明.

为了保持向后兼容性,您可以使用以下内容:

var myArr = [
  {"id":1,"user":{"name":"allen","id":101}},
  {"id":2,"user":{"name":"martin","id":102}}
]

function dynamicSort(propFn, sortOrder = 1) {
    if (typeof propFn === "string") {
        let prop = propFn;
        if (prop[0] === "-") {
            sortOrder = -1;
            prop = prop.substr(1);
        }

        propFn = (obj) => obj[prop];
    }
    return function (a, b) {
        var result = (propFn(a) < propFn(b)) ? -1 : (propFn(a) > propFn(b)) ? 1 : 0;
        return result * sortOrder;
    }
}

console.log(myArr.sort(dynamicSort((obj) => obj.user.name)));
console.log(myArr.sort(dynamicSort((obj) => obj.user.name, -1)));
console.log(myArr.sort(dynamicSort("id")));
console.log(myArr.sort(dynamicSort("-id")));
Run Code Online (Sandbox Code Playgroud)