过滤和排序JSON数组

时间:2017-03-21 04:54:26

标签: javascript angularjs arrays json

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,但是我需要按名称构建一个只包含具有最大值的对象的辅助数组。

4 个答案:

答案 0 :(得分:4)

你可以使用lodash 4+。

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

这将按重量对数组进行排序。 然后 , 的 _。uniqBy(sortedArray, '姓名')

这将返回最后一个数组。

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')

答案 1 :(得分:3)

我推荐一种函数式编程方法:

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

在此示例中,您只返回无法找到共享相同名称但权重较大的记录的记录。此外,您重新构建的新数组存储在newRecords中,原始数组保持不变。

答案 2 :(得分:2)

首先按名称顺序和重量顺序对项目进行排序,然后过滤除每个项目中的第一项以外的所有项目。

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
  })
)

答案 3 :(得分:1)

我建议你开始使用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 ]);