在排序多个数组后返回数据

时间:2017-11-16 15:30:11

标签: javascript arrays sorting

我在对象中嵌套了数组,我需要提取这些值,然后按字母顺序对它们进行排序,然后将其显示在表格中。

我正在使用localeCompare方法,但它正在返回:

Cannot read property 'localeCompare' of null

说实话,我不确定我是否正确接近这一点。使用sort,您可以将ab进行比较,以按字母顺序对其进行排序。我很困惑如何比较ab中数组的值。我使用sort上的第一个tableData来访问数组,并使用第二个sort来比较我推送到数组的值clientRefArr

if(params.sorting().clientRef) {

        var clientRefArr = [];

        tableData.sort(function(a, b){

            a.renewalUIs.forEach(function(data, i){
                clientRefArr.push(data.patentUI.clientRef);
            })

            return clientRefArr.sort(function(a, b){
                console.log(a.localeCompare(b))
                // return a.localeCompare(b)
            })

        })

    orderedData = tableData;

}

return orderedData;

问题

为什么错误Cannot read property 'localeCompare' of null被退回?我是否完全错误地处理了这个问题?

//JSON

[
 0: {
     transRef: "IX1000013"
     renewalProgress: 30
     renewalUIs: [
        0: {
            patentUI: {
               business: null
               clientRef: P0101011 // this is the required value 
            }
            renewalAttemptsMade: 1
            renewalDueDate: 1514764740000
         }
     ]

   },
 1: {
     transRef: "IX100333"
     renewalProgress: 55
     renewalUIs: [
        0: {
            patentUI: {
               business: null
               clientRef: P0101011 // this is the required value 
            }
            renewalAttemptsMade: 1
            renewalDueDate: 1514764740000
         },
        1: {
            patentUI: {
               business: null
               clientRef: P5551011 // this is the required value 
            }
            renewalAttemptsMade: 3
            renewalDueDate: 174834740000
         }
     ]

   }
]

2 个答案:

答案 0 :(得分:1)

您可以为这两个部分采用默认值

(a || '').localeCompare(b || '')

用于将null值或甚至所有falsy值排序到顶部。

使用给定数据的尝试(我更改了一些值,以获得一些排序)。

现在首先对内部数组renewalUIs进行排序,然后使用第一个元素对外部数组进行排序。

var array = [{ transRef: "IX1000013", renewalProgress: 30, renewalUIs: [{ patentUI: { business: null, clientRef: "P9101011" }, renewalAttemptsMade: 1, renewalDueDate: 1514764740000 }] }, { transRef: "IX100333", renewalProgress: 55, renewalUIs: [{ patentUI: { business: null, clientRef: "P7101011" }, renewalAttemptsMade: 1, renewalDueDate: 1514764740000 }, { patentUI: { business: null, clientRef: "P5551011" }, renewalAttemptsMade: 3, renewalDueDate: 174834740000 }] }];

array.forEach(function (o) {
    o.renewalUIs.sort(function (a, b) {
        return a.patentUI.clientRef.localeCompare(b.patentUI.clientRef);
    });
});

array.sort(function (a, b) {
    return a.renewalUIs[0].patentUI.clientRef.localeCompare(b.renewalUIs[0].patentUI.clientRef);
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

如果我的解释是正确的,那么首先将所有内容放在一个数组中然后对它进行排序就更容易了,只需使用第一个任务的循环和第二个任务的正常排序,嵌套的排序真的只是一个坏主意。

# A tibble: 224 x 3
# Groups:   origin [?]
   origin  dest mean_time
    <chr> <chr>     <dbl>
 1    EWR   ALB  31.78708
 2    EWR   ANC 413.12500
 3    EWR   ATL 111.99385
 4    EWR   AUS 211.24765
 5    EWR   AVL  89.79681
 6    EWR   BDL  25.46602
 7    EWR   BNA 114.50915
 8    EWR   BOS  40.31275
 9    EWR   BQN 196.17288
10    EWR   BTV  46.25734
# ... with 214 more rows

如果&#34; renewalUIs&#34;或&#34; patentUIs&#34;你不能迭代字典的密钥。