javascript - javascript对象按数组排序
问题描述
有没有办法对结构中的对象数组进行排序,例如:
var objs = [{
"name": "B",
"value": 1
}, {
"name": "D",
"value": "45"
}, {
"name": "E",
"value": "234"
}, {
"name": "A",
"value": "543"
}, {
"name": "C",
"value": "250"
}, {
"name": "B",
"value": 6
}, {
"name": "D",
"value": "234"
}, {
"name": "E",
"value": "67"
}, {
"name": "A",
"value": "78"
}, {
"name": "C",
"value": "12"
}];
通过另一个数组中的元素:
var orderedArray = ["E", "C", "B", "A", "D"];
为了获得如下结构:
{
"name": "E",
"value": "234"
},
{
"name": "C",
"value": "250"
},
{
"name": "B",
"value": 1
},
{
"name": "A",
"value": "543"
},
{
"name": "D",
"value": "45"
},
{
"name": "E",
"value": "67"
},
{
"name": "C",
"value": "12"
},
{
"name": "B",
"value": 6
},
{
"name": "A",
"value": "78"
},
{
"name": "D",
"value": "234"
}
我正在尝试按名称键的索引使用 sort() 函数:
var objs = [{ "name": "B", "value": 1 }, { "name": "D", "value": "45" }, { "name": "E", "value": "234" }, { "name": "A", "value": "543" }, { "name": "C", "value": "250" }, { "name": "B", "value": 6 }, { "name": "D", "value": "234" }, { "name": "E", "value": "67" }, { "name": "A", "value": "78" }, { "name": "C", "value": "12" }];
var orderedArray = ["E", "C", "B", "A", "D"];
var sorted = objs.sort((a, b) => orderedArray.indexOf(a.name) - orderedArray.indexOf(b.name));
console.log(sorted);
但结果的顺序不正确。
示例:jsfiddle
解决方案
您可以使用 map 进行排序并获取组和 order 以获得序列排序。
var array = [{ name: "B", value: 1 }, { name: "D", value: "45" }, { name: "E", value: "234" }, { name: "A", value: "543" }, { name: "C", value: "250" }, { name: "B", value: 6 }, { name: "D", value: "234" }, { name: "E", value: "67" }, { name: "A", value: "78" }, { name: "C", value: "12" }],
order = ["E", "C", "B", "A", "D"],
groups = Object.create(null),
result = array
.map((o, i) => ({ index: i, order: order.indexOf(o.name), group: groups[o.name] = (groups[o.name] || 0) + 1 }))
.sort((a, b) => a.group - b.group || a.order - b.order)
.map(({ index }) => array[index]);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- python - Python在使用密码学解码后从字符串中获取变量
- android - 如何更改 BLE Mesh 网络中节点的组地址?
- bash - 使用 For 循环重命名 Bash
- python - 无法从脚本自动安装 python 包
- flutter - Flutter 2.5.2 给出错误编译时间 app:checkDebugAarMetadata
- android - 转到 recyclerview 中的最后一项
- python - 在 Docker 中运行的 Python 版本错误
- string - 使字段仅允许某些字符串
- moodle - 如何翻译moodle的日历?
- android - Android 应用程序在 Chrome 浏览器 (94.0.4606.80) 上的 AppAuth 自定义选项卡意图的密码字段上崩溃