1
var customersObj= [ 
    { recordId: "123", groupID: "1992" ,memberID:"10" Name : "John"     },
    { recordId: "141",  groupID: "1994" ,memberID:"13", Name : "Arrow"  },
    { recordId: "111", groupID: "1991",memberID:"12", Name : "Mike" }
];

I need to return the array by sort them first by recordId, then by groupID, then by memberID ...

I tried this but didn't get expected result"

return _.sortBy(customersObj,'recordID','groupID','memberID');

Can someone assist here on this...

7 Answers 7

2

Pay attention that your *ID are strings, so, I've used Array.map to convert them to ints, and then _.sortBy works expectedly.

I've added additional values to check the sub-sorting.

const customersObj = [{
  recordId: "123",
  groupID: "1992",
  memberID: "10",
  Name: "John"
}, {
  recordId: "141",
  groupID: "1994",
  memberID: "13",
  Name: "Arrow"
}, {
  recordId: "111",
  groupID: "1991",
  memberID: "12",
  Name: "Mike"
}, {
  recordId: "123",
  groupID: "1991",
  memberID: "12",
  Name: "Sean"
}, {
  recordId: "123",
  groupID: "1991",
  memberID: "11",
  Name: "Sara"
}];

const result = customersObj.map(item => ({
  recordId: parseInt(item.recordId, 10),
  groupID: parseInt(item.groupID, 10),
  memberID: parseInt(item.memberID, 10),
  Name: item.Name
}));

console.log(_.sortBy(result, 'recordId', 'groupID', 'memberID'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

Sign up to request clarification or add additional context in comments.

2 Comments

thanks @felixmosh, but converting in to INT doesn't applicable for memberID with values more than six digits, for example the real data for member ID would be '1342493', '148005', '1808779'..So please advice how to sort with third value
JS supports 6 digits as ints... max value is Number.MAX_SAFE_INTEGER = 9007199254740991
0

Try use this approach:

const customersObj= [
  { recordId: "123", groupID: "1992" ,memberID:"10", Name : "John"     },
  { recordId: "141",  groupID: "1994" ,memberID:"13", Name : "Arrow"  },
  { recordId: "111", groupID: "1991",memberID:"12", Name : "Mike" }
];

const sorted = customersObj.sort((a,b)=>{
  return a.recordId - b.recordId || a.groupID - b.groupID || a.memberID - b.memberID;
})    

console.log(`sorted`, sorted);

Comments

0

you can use sort method with lambda function to sort.

const list = [
{      color: 'white', size: 'XXL' },
    { color: 'red', size: 'XL' },
   { color: 'black', size: 'M' }
]
list.sort((a, b) => (a.color > b.color) ? 1 : -1) // you can add different conditions here.

Comments

0

to sort multiple fields, do it like this

customersObj.sort(function(a, b) {
    return a["recordId"] - b["recordId"] || a["groupID"] - b["groupID"] || a["memberID"] - b["memberID"];
});

Comments

0

You can sort array of object using multiple values by the following method

var arrayOfObj = [ 
    { recordId: "123", groupID: "1992" ,memberID:"10" , Name : "John"     },
    { recordId: "141",  groupID: "1994" ,memberID:"13", Name : "Arrow"  },
    { recordId: "111", groupID: "1991",memberID:"12", Name : "Mike" }
];

let sortBy = [{
  prop:'recordId',
  direction: 1
},{
  prop:'lastName',
  direction: 1
},{
  prop:'memberID',
  direction: 1
}];

arrayOfObj.sort(function(a,b){
  let i = 0, result = 0;
  while(i < sortBy.length && result === 0) {
    result = sortBy[i].direction*(a[ sortBy[i].prop ].toString() < b[ sortBy[i].prop ].toString() ? -1 : (a[ sortBy[i].prop ].toString() > b[ sortBy[i].prop ].toString() ? 1 : 0));
    i++;
  }
  return result;
})

console.log(arrayOfObj, ":::::");

Comments

0

With lodash, could take an array of keys and take the right spelling of the wanted keys.

var customersObj = [{ recordId: "123", groupID: "1992", memberID: "10", Name: "John" }, { recordId: "141", groupID: "1994", memberID: "13", Name: "Arrow" }, { recordId: "111", groupID: "1991",
memberID: "12", Name: "Mike" }];

console.log(_.sortBy(customersObj, ['recordId', 'groupID', 'memberID']));
//                                 ^        ^                        ^
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Comments

0

Hi i tried solve your problem :)

const display = document.querySelector(".display");

var customersObj= [ 
    { recordId: "123", groupID: "1992" ,memberID:"10", Name : "John"     },
    { recordId: "141",  groupID: "1994" ,memberID:"13", Name : "Arrow"  },
    { recordId: "111", groupID: "1991",memberID:"12", Name : "Mike" }
];
customersObj.sort(function (a, b) {
    return a.recordId - b.recordId || b.groupID - a.groupID || c.memberID - c.memberID;
});
customersObj.map(obj => {
  const item = document.createElement("div");
  item.textContent += obj.recordId + " " + obj.groupID + " " + obj.memberID +" "+ obj.Name;
  display.appendChild(item);
});
<div class="display">
</div>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.