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