Search code examples
javascriptlodash

How to sort a array of object based on a key and set an addition key which should increment upon change in sequence?


I have an array which should be sorted based on conditionalTo and set a index based on the sequence, whenever the sequence is changed index should be incremented. once this is done we need to sort the array again based on computationTo within the index only second level sorting should happen

const array = 
[
{conditionalFrom: 102, conditionalTo: 112, computationFrom: 10, computationTo: 150},
{conditionalFrom: 0, conditionalTo: 100, computationFrom: 0, computationTo: 400},
{conditionalFrom: 10, conditionalTo: 100, computationFrom: 0, computationTo: 300},
{conditionalFrom: 0, conditionalTo: 110, computationFrom: 20, computationTo: 200},
{conditionalFrom: 12, conditionalTo: 112, computationFrom: 100, computationTo: 1000},
{conditionalFrom: 100, conditionalTo: 110, computationFrom: 1001, computationTo: 100000},
]

sorted based on conditionalTo and added number for each sequence

const sorted = 
[
{conditionalFrom: 0, conditionalTo: 100, computationFrom: 0, computationTo: 400, sequece: 1},
{conditionalFrom: 10, conditionalTo: 100, computationFrom: 0, computationTo: 300, sequece: 1},
{conditionalFrom: 0, conditionalTo: 110, computationFrom: 20, computationTo: 200, sequece: 2},
{conditionalFrom: 100, conditionalTo: 110, computationFrom: 1001, computationTo: 100000, sequece: 2},
{conditionalFrom: 12, conditionalTo: 112, computationFrom: 100, computationTo: 1000, sequece: 3},
{conditionalFrom: 102, conditionalTo: 112, computationFrom: 10, computationTo: 150, sequece: 3},
]

sort based on computationTo and sequence

const sorted = 
[
{conditionalFrom: 0, conditionalTo: 100, computationFrom: 0, computationTo: 400},
{conditionalFrom: 0, conditionalTo: 110, computationFrom: 20, computationTo: 200},
{conditionalFrom: 10, conditionalTo: 100, computationFrom: 0, computationTo: 300},
{conditionalFrom: 12, conditionalTo: 112, computationFrom: 100, computationTo: 1000},
{conditionalFrom: 100, conditionalTo: 110, computationFrom: 1001, computationTo: 100000},
{conditionalFrom: 102, conditionalTo: 112, computationFrom: 10, computationTo: 150},
]

tried soo many methods including noramal sort lodash sortby orderby but nothing really worked pls help Added sequence is actually a work around when nothing really worked

 const SlabDetails = orderBy(this.tableData, [r => r.conditionalTo - r.conditionalFrom, r => r.computationTo - r.computationFrom], "asc");

Previous question


Solution

  • You are thinking of it in the wrong order. You can sort the array based on conditionalTo and computationTo first. Then, add a sequence property to each object. Increment it if the conditionalTo is different compared to the previous object

    const array =[{conditionalFrom:102,conditionalTo:112,computationFrom:10,computationTo:150},{conditionalFrom:0,conditionalTo:100,computationFrom:0,computationTo:400},{conditionalFrom:10,conditionalTo:100,computationFrom:0,computationTo:300},{conditionalFrom:0,conditionalTo:110,computationFrom:20,computationTo:200},{conditionalFrom:12,conditionalTo:112,computationFrom:100,computationTo:1000},{conditionalFrom:100,conditionalTo:110,computationFrom:1001,computationTo:100000},];
    
    array.sort((a,b) => a.conditionalTo - b.conditionalTo || a.computationTo - b.computationTo)
    
    let previous,
        sequence = 0;
        
    for (const o of array) {
      if (o.conditionalTo !== previous) {
        ++sequence;
        previous = o.conditionalTo
      } 
      o.sequence = sequence
    }
    
    console.log(array)