2

I have this array:

[{
    "group": "admin",
    "menuorder": 8,
    "screen": [{
        "role": "name4",
        "order": 1,
        "ui": [{
          "info": "Grey",
          "name": "Dog",
          "MenuOrder": 5
        }]
      },
      {
        "role": "name1",
        "order": 9,
        "ui": [{
            "info": "white2",
            "name": "Cat2",
            "MenuOrder": 2
          },
          {
            "info": "white1",
            "name": "Cat1",
            "MenuOrder": 1
          }
        ]
      }
    ]
  },
  {
    "group": "client",
    "menuorder": 6,
    "screen": [{
      "role": "name2",
      "order": 3,
      "ui": [{
        "info": "Grey",
        "name": "goldfish",
        "MenuOrder": 2
      }]
    }]
  }
]

I want to order the position of this section from MenuOrder 1, 2, 3...

{
  "role": "name1",
  "order": 9,
  "ui": [{
      "info": "white2",
      "name": "Cat2",
      "MenuOrder": 2
    },
    {
      "info": "white1",
      "name": "Cat1",
      "MenuOrder": 1
    }
  ]
}

Here is this my code. Any help from everyone very helpful to me. Thank you.

let sorts = _.orderBy(result, function(e) { 
  return _.orderBy(e.screen.ui, function(c) {
   c.MenuOrder
  }, ['asc']);
}, ['asc']);
Rory McCrossan
  • 331,213
  • 40
  • 305
  • 339

1 Answers1

2

You could use _.cloneDeepWith to create a complete clone, but with a callback function (customizer) which will treat ui property values differently: it will return a sorted version of it:

const result = [{"group": "admin","menuorder": 8,"screen": [{"role": "name4","order": 1,"ui": [{"info": "Grey","name": "Dog","MenuOrder": 5}]},{"role": "name1","order": 9,"ui": [{"info": "white2","name": "Cat2","MenuOrder": 2},{"info": "white1","name": "Cat1","MenuOrder": 1}]}]},{"group": "client","menuorder": 6,"screen": [{"role": "name2","order": 3,"ui": [{"info": "Grey","name": "goldfish","MenuOrder": 2}]}]}];

const sorted = _.cloneDeepWith(result, v => {
    if (_.has(v, "ui")) return _.assign({}, v, { ui: _.sortBy(v.ui, "MenuOrder") });
});

console.log(sorted);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.16.4/lodash.min.js"></script>
trincot
  • 317,000
  • 35
  • 244
  • 286