簡體   English   中英

過濾和排序JSON數組

[英]Filtering and sorting a JSON array

records = [
        {
            name: "Alpha",
            set: 5,
            weight: 185
        },      
        {
            name: "Alpha",
            set: 5,
            weight: 350
        },        
        {
            name: "Bravo",
            set: 5,
            weight: 185
        },        
        {
            name: "Charlie",
            set: 5,
            weight: 185
        },         
        {
            name: "Delta",
            set: 5,
            weight: 185
        }
]

我有多個記錄的JSON數組,我需要按名稱和權重過濾這些記錄。 因此,例如,由於有兩個“ Alpha”記錄,因此我只需要提取權重最高的一個(這將是第二個記錄)。 我不知道如何過濾和重建僅具有所需結果的數組。

我需要保持原始數組完整無缺,因為我將在表中顯示ALL,但是按名稱命名,我需要構建僅包含具有最大價值的對象的輔助數組。

您可以為此使用lodash 4+。

var sortedArray = _.orderBy(records,['weight'],['desc']);

這將按重量對數組進行排序。 然后, _.uniqBy(sortedArray,'name')

這將返回最終數組。

var records = [
        {
            name: "Alpha",
            set: 5,
            weight: 185
        },      
        {
            name: "Alpha",
            set: 5,
            weight: 350
        },        
        {
            name: "Bravo",
            set: 5,
            weight: 185
        },        
        {
            name: "Charlie",
            set: 5,
            weight: 185
        },         
        {
            name: "Delta",
            set: 5,
            weight: 185
        }
]

var sortedArray = _.orderBy(records, ['weight'], ['desc'])

_.uniqBy(sortedArray,'name')

我推薦一種函數式編程方法:

var newRecords = records
    .filter(function(record) { 
        return records.find(function(innerRecord) {
            return innerRecord.name === record.name && innerRecord.weight > record.weight; }) === undefined;
     });

在此示例中,僅返回找不到相同名稱但權重較大的記錄的記錄。 另外,新重建的數組存儲在newRecords ,而原始數組保持不變。

這首先按名稱順序和權重順序對項目進行排序,然后過濾掉除每個項目的第一個以外的所有項目。

 var records = [{ name: "Alpha", set: 5, weight: 185 }, { name: "Alpha", set: 5, weight: 350 }, { name: "Bravo", set: 5, weight: 185 }, { name: "Charlie", set: 5, weight: 185 }, { name: "Charlie", set: 5, weight: 200 }, { name: "Delta", set: 5, weight: 185 } ] console.log( records.sort((a, b) => { if (a.name === b.name) { return a.weight >= b.weight ? -1 : 1 } return a.name > b.name ? 1 : -1 }) .filter((rec, i, arr) => { if (i === 0) return true return rec.name !== arr[i - 1].name }) ) 

我建議您開始使用lodash,不要花時間創建自己的函數。 例如,要按名稱對數組進行排序,應編寫以下代碼:

    var records = [
        {
            name: "Alpha",
            set: 5,
            weight: 185
        },      
        {
            name: "Alpha",
            set: 5,
            weight: 350
        },        
        {
            name: "Bravo",
            set: 5,
            weight: 185
        },        
        {
            name: "Charlie",
            set: 5,
            weight: 185
        },         
        {
            name: "Delta",
            set: 5,
            weight: 185
        }
];
var sorted = _.sortBy(records, ['name']);

第二種情況,按名稱和權重進行過濾

var filtered = _.filter(records, [ 'name': 'Alpha', 'weight': 350 ]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM