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

标签 javascript arrays sorting javascript-objects

我想按“用户”对象中的“名称”对下面的数组进行排序

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

我该怎么做?

我有一种方法可以对对象数组进行排序,但我不能将它用于对象的对象数组

这是方法:

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;
    }
}

然后我可以用这个排序:

myArr.sort(dynamicSort("id"));

最佳答案

我会将属性创建为一个 getter 函数(对于复杂的示例。您可以检查 propFn 是否是一个函数,在下面使用它来处理更复杂的函数。请参阅 this answer 检查是 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)));

或者,您可以查看:Convert JavaScript string in dot notation into an object reference

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

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

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")));

关于javascript - 在javascript中对对象的对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51615991/

相关文章:

javascript - 如何保持一次显示一个悬停?

javascript - 元素类型无效 : undefined - Reactjs

javascript - 让 list.js 和 react.js 协同工作

c# - 如何在运行时知道属于结构体的 char 数组的长度

python - 对字母数字二维数组进行数字排序

c++ - 使用 stable_sort() 将 double 排序为整数

javascript - 国际电话输入 - RegExp 占位符问题

javascript - JS数组切换推送和拼接

Javascript - 计算对象数组中的重复项并将计数存储为新对象

javascript - 来自 Node.js 中两个 JavaScript 对象的查询字符串中的参数已排序