Sorting fields directly from an object works, but how to sort fields from a related object? How do you access the Description__c field so that you can sort the records?


public static List<MonthlyExpense__c> getExpenseCard(){

    List<MonthlyExpense__c> card = [Select Id, Name, MonthDate__c,
           (Select Name, Amount__c,  CardDate__c, Description__c FROM Expense_Cards__r)
                                  FROM MonthlyExpense__c ];
    return card;


<aura:application controller="Login">

<aura:attribute type="List" name="data" />
<aura:attribute type="List" name="sorte" />
<aura:attribute type="Boolean" name="sortAsc" />
<aura:attribute type="String" name="sortField" />
<aura:handler name="init" value="{!this}" action="{!c.doInit}" />

        <td onclick="{!c.sortByName}">Name</td>
        <td onclick="{!c.sortByDate}">MonthDate</td>
        <td onclick="{!c.sortByDescription}">Description</td>
        <aura:iteration items="{!v.data}" var="record">
                <aura:iteration items="{!record.Expense_Cards__r}" 


doInit: function(component, event, helper) {
    var load = component.get("c.getExpenseCard");
    load.setCallback(this, function(result) {
        component.set("v.data", result.getReturnValue());
        component.set("v.sortAsc", true);
sortByName: function(component, event, helper) {
    helper.sortBy(component, "Name");
sortByAmount: function(component, event, helper) {
    helper.sortBy(component, "MonthDate__c");
    sortByDescription: function(component, event, helper) {
    helper.sortBy(component, "Description__c");


 sortBy: function(component, field) {
    var sortAsc = component.get("v.sortAsc"),
        sortField = component.get("v.sortField"),
        records = component.get("v.data");
    sortAsc = field == sortField? !sortAsc: true;
        var t1 = a[field] == b[field],
            t2 = a[field] > b[field];
        return t1? 0: (sortAsc?-1:1)*(t2?-1:1);
    component.set("v.sortAsc", sortAsc);
    component.set("v.sortField", field);
    component.set("v.data", records);
  • I edited the code to address this issue. I can't at-mention you because apparently your username includes content that can't be in a comment.
    – sfdcfox
    Jul 18, 2020 at 17:39

1 Answer 1


You just need a helper method:

function getValue(source, target) {
  let path = target.split(/\./);
  while(path.length > 1 && source) {
    if(source instanceof Array) {
      source = source[0];
    source = source && source[path.shift()];
  return source && source[path[0]];

Then, you can plug that in to the function:

    var v1 = this.getValue(a,field),
        v2 = this.getValue(b,field),
        t1 = v1 == v2,
        t2 = v1 > v2;

And specify the entire field path in the method parameter:

helper.sortBy(component, "Expense_Cards__r.Description__c");

This function will only follow the first child of an array when using child records, but it should handle child and parent relationships in any arbitrary order.

  • Throws an error: ReferenceError: Action failed: c: SortingC $ controller $ sortByDescription [getValue is not defined] Jul 18, 2020 at 17:04

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .