javascript - 基于两个字段对对象数组进行排序 - Javascript
问题描述
我有一些数据,我想根据两个不同的字段对数组进行排序,并更改“order”属性。每个对象都有一个值为“Before”和“After”的位置属性。之前应该先来,然后是之后。另外,一个类别中的 before 属性对象应该有一个单独的索引,一个类别中的 after 属性对象应该有一个从 1 开始的单独索引。我几乎完成了,但无法修复顺序。请帮忙。
const data = [{
"id": 0,
"mdmStep": {
"name": "Insert to Stage",
"id": 1
},
"relativePosition": {
"name": "After",
"id": 2
},
"order": 1,
"details": [{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_TRAN"
}]
},
{
"id": 3,
"mdmStep": {
"name": "Insert to Stage",
"id": 1
},
"relativePosition": {
"name": "Before",
"id": 1
},
"order": 4,
"details": [{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_CONFIG"
}]
},
{
"id": 1,
"mdmStep": {
"name": "Insert to Stage",
"id": 1
},
"relativePosition": {
"name": "After",
"id": 2
},
"order": 2,
"details": [{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_ADDR"
}]
},
{
"id": 2,
"mdmStep": {
"name": "Insert to Raw",
"id": 2
},
"relativePosition": {
"name": "After",
"id": 2
},
"order": 3,
"details": [{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_ADDR"
}]
},
{
"id": 4,
"mdmStep": {
"name": "Insert to Raw",
"id": 2
},
"relativePosition": {
"name": "After",
"id": 2
},
"order": 5,
"details": [{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_CONFIG"
}]
},
{
"id": 5,
"mdmStep": {
"name": "Update Match Fields",
"id": 5
},
"relativePosition": {
"name": "Before",
"id": 1
},
"order": 6,
"details": [{
"commandText": "HELLO ARUN"
}]
}
]
const groups = _.groupBy(data, 'mdmStep.name')
const groupValues = _.reduce(_.keys(groups), (a, c) => {
a[c] = _.orderBy(groups[c], 'relativePosition.id').map((i, idx) => {
if (i.relativePosition.id === 1) {
return {
...i,
order: idx
}
}
return {
...i,
order: idx
}
});
return a
}, {})
const changeOrders = _.orderBy(_.flattenDeep((_.map(_.keys(groupValues), group => {
return _.map(groupValues[group], (i, index) => {
return {
...i,
order: index || index + 1
}
})
}))), 'mdmStep.id')
console.log(changeOrders)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
预期的输出是
[
{
"id": 3,
"mdmStep": {
"name": "Insert to Stage",
"id": 1
},
"relativePosition": {
"name": "Before",
"id": 1
},
"order": 1,
"details": [
{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_CONFIG"
}
]
},
{
"id": 0,
"mdmStep": {
"name": "Insert to Stage",
"id": 1
},
"relativePosition": {
"name": "After",
"id": 2
},
"order": 1,
"details": [
{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_TRAN"
}
]
},
{
"id": 1,
"mdmStep": {
"name": "Insert to Stage",
"id": 1
},
"relativePosition": {
"name": "After",
"id": 2
},
"order": 2,
"details": [
{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_ADDR"
}
]
},
{
"id": 2,
"mdmStep": {
"name": "Insert to Raw",
"id": 2
},
"relativePosition": {
"name": "After",
"id": 2
},
"order": 1,
"details": [
{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_ADDR"
}
]
},
{
"id": 4,
"mdmStep": {
"name": "Insert to Raw",
"id": 2
},
"relativePosition": {
"name": "After",
"id": 2
},
"order": 2,
"details": [
{
"commandText": "SELECT * FROM MDSRC_PRO_KOMODO_CONFIG"
}
]
},
{
"id": 5,
"mdmStep": {
"name": "Update Match Fields",
"id": 5
},
"relativePosition": {
"name": "Before",
"id": 1
},
"order": 1,
"details": [
{
"commandText": "HELLO ARUN"
}
]
}
]
在上面的响应中,before 后面跟着 after,并且 index 再次重置为 1 for after。这是预期的行为。
请指教。
解决方案
在changeOrders
你index + 1
每次迭代时增加,但必须只在 if 中做index === 0
,就这样写return {...i, order: index || index + 1}
推荐阅读
- java - Java如何调用另一个类中的方法
- go - “if and (ne)”运算符在 helm 中是如何工作的?
- mysql - 只有在我的 sql where 语句中满足所有条件时才能得到结果
- c# - 如何在字符中写撇号
- python - Unable to quit a python script (which is using loop) from terminal using Ctrl+C
- c# - 当达到文本框中的字符数时,跳转到按钮回车
- c# - 如何使后台线程向GUI线程发出所有数据已收到并且可以让用户继续的信号
- sql - HIVE 转换 unix 时间戳进行计算
- ruby-on-rails - 将 has_many 与多态模型一起使用
- c# - Monogame透明图像出血