javascript - 从数组中删除对象,其中一个键是重复的,另一个键比其他键少
问题描述
我有这个带有对象的数组:
var data=[
{ number: '31907411282', unix_date: '1547012427' },
{ number: '31907411282', unix_date: '1547013214' },
{ number: '31907514691', unix_date: '1547015155' },
{ number: '31907514691', unix_date: '1547015232' },
{ number: '31907514691', unix_date: '1547016134' },
{ number: '31907514691', unix_date: '1547016443' },
{ number: '31907638716', unix_date: '1547017122' },
{ number: '31907644067', unix_date: '1547017381' }
]
如何删除具有较新日期的重复对象并获得这样的新数组:
var new_data=[
{ number: '31907411282', unix_date: '1547012427' },
{ number: '31907514691', unix_date: '1547015155' },
{ number: '31907638716', unix_date: '1547017122' },
{ number: '31907644067', unix_date: '1547017381' }
]
我无法理解如何完成所有程序。谢谢
更新
我尝试这种结构:
- 首先我们需要对对象进行分组和排序
- 第二步是从分组中获取第一个对象并推送到新数组
代码:
var data=[
{ number: '31907411282', unix_date: '1547012427' },
{ number: '31907411282', unix_date: '1547013214' },
{ number: '31907514691', unix_date: '1547019134' },
{ number: '31907514691', unix_date: '1547015232' },
{ number: '31907514691', unix_date: '1547016134' },
{ number: '31907514691', unix_date: '1547016443' },
{ number: '31907638716', unix_date: '1547017122' },
{ number: '31907644067', unix_date: '1547017381' }
]
var new_data=[];
var groupByNumber=groupBy(data, 'number');
for(i in groupByNumber){
var sort_arr=groupByNumber[i].sort(compare)
new_data.push(sort_arr[0])
}
console.log(new_data)
function compare(a, b) {
let comparison = 0;
if (a.unix_date > b.unix_date) {
comparison = 1;
} else if (a.unix_date < b.unix_date) {
comparison = -1;
}
return comparison;
}
function groupBy(xs, key) { //group by key
return xs.reduce(function(rv, x) {
(rv[x[key]] = rv[x[key]] || []).push(x);
return rv;
}, {});
};
也许它可以更优雅
更新 2
@miroslav-glamuzina 提供更优雅的方式:
let filtered = data.reduce((acc, item) => {
if (!acc.some((e, i) => {
if (item.number === e.number) {
if (item.unix_date < e.unix_date) {
acc.splice(i, 1, item);
}
return true;
}
})) {
acc.push(item);
}
return acc;
}, []);
解决方案
您可以使用reduce
循环遍历数组并存储一组键(number
)来检查它是否存在。然后推入新数组。
var data=[
{ number: '31907411282', unix_date: '1547012427' },
{ number: '31907411282', unix_date: '1547013214' },
{ number: '31907514691', unix_date: '1547015155' },
{ number: '31907514691', unix_date: '1547015232' },
{ number: '31907514691', unix_date: '1547016134' },
{ number: '31907514691', unix_date: '1547016443' },
{ number: '31907638716', unix_date: '1547017122' },
{ number: '31907644067', unix_date: '1547017381' }
]
const rs = data.reduce((acc, e) => {
if(!acc.number.has(e.number)) {
acc.newData.push(e)
acc.number.add(e.number)
}
return acc
}, {number: new Set(), newData: []})
console.log(rs.newData)
推荐阅读
- javascript - 如何选择请求日期在 PHP Laravel 的两个日期之间?
- javascript - 如何使用返回承诺的参数创建操作?
- haskell - Haskell 中的可变但可锁定的数据结构?
- reactjs - 在组件内调用函数
- c - 在 C 中是否有一个函数可以用作“实例方法”?
- android - 从联系人中获取数据在android中花费了太多时间
- c - 如何计算c中的空白空间
- excel - 除了使用 VBA 在 excel 中命名的工作表之外,在所有工作表上运行特定的宏
- python - 计算平均python
- javascript - PHP & JavaScript - 变量