【发布时间】:2021-12-14 14:19:41
【问题描述】:
我有一些数据,我想根据两个不同的字段对数组进行排序,并更改“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。这是预期的行为。
请指教。
【问题讨论】:
-
@nina-scholz 你能帮我解决这个问题吗?
标签: javascript arrays sorting lodash