繁体   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