首页 > 解决方案 > 基于两个字段对对象数组进行排序 - 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。这是预期的行为。

请指教。

标签: javascriptarrayssortinglodash

解决方案


changeOrdersindex + 1每次迭代时增加,但必须只在 if 中做index === 0,就这样写return {...i, order: index || index + 1}


推荐阅读