问题描述
我有一个像这样的对象数组(按时间戳升序排序):
[
{id: 'o3134432S2', tot: '45', type: 'dynamic', timestamp: '2018-04-03'},
{id: '3566543aa3', tot: '34', type: 'saved', timestamp: '2018-04-03'},
{id: '4530134a97', tot: '34', type: 'gold', timestamp: '2018-04-04'},
{id: '234554b333', tot: '42', type: 'saved', timestamp: '2018-04-04'},
{id: '2463545633', tot: '55', type: 'dynamic', timestamp: '2018-04-05'},
{id: '5654324566', tot: '13', type: 'saved', timestamp: '2018-04-06'}
]
这个数组可能真的很长(超过一千个值),每天可能有 1 个金币、1 个储蓄,或两者兼而有之。 我想每天删除达布隆,如果存在的话,优先考虑保存的达布隆。 就我而言,这将返回:
[
{id: '3566543aa3', tot: '34', type: 'saved', timestamp: '2018-04-03'},
{id: '234554b333', tot: '42', type: 'saved', timestamp: '2018-04-04'},
{id: '2463545633', tot: '55', type: 'dynamic', timestamp: '2018-04-05'},
{id: '5654324566', tot: '13', type: 'saved', timestamp: '2018-04-06'}
]
我已经使用很多 while 和 foreach 做了一些事情,但它需要 5 到 30 秒,而且我很确定它可以更快。
function remouveDoublon(originalArray) {
const filteredSaved = originalArray.filter(forecast => {forecast.type === "saved" })
const filteredDynamic = forecastProductOrders.filter((forecast) => { return forecast.type === 'dynamic' })
let exists = false;
if (filteredSaved.length > 0) {
filteredSaved.forEach(forecast => {
exists = false;
for (var i = 0; i < filteredDynamic.length; i++) {
if (moment(filteredDynamic[i].timestamp).isSame(moment(forecast.timestamp), 'day') && filteredDynamic[i].supplierProductId === forecast.supplierProductId) {
filteredDynamic[i].tot = forecast.tot;
exists = true;
break;
}
}
if (exists === false) {
let objToPush = forecast;
objToPush.type === 'saved';
filteredDynamic.push(objToPush);
}
})
}
return filteredDynamic
}
有没有人知道如何做这个?
非常感谢
1楼
Alexus
0
2019-02-21 09:09:04
您可以遍历数组并使用日期作为键将每个条目保存在字典中。 如果条目已经存在,请检查类型并仅在“已保存”时更新它。 然后再次将字典转换为列表。 这将具有线性运行时间。 也许像这样
unique = {}
for entry in entries:
if unique[entry.date] and unique[entry.date].type == "saved":
continue
unique[entry.date] = entry
print(list(unique))
2楼
holydragon
0
2019-02-21 09:19:09
您可以使用此方法,然后根据需要再次将其排序为我的时间戳。
const data = [ {id: 'o3134432S2', tot: '45', type: 'dynamic', timestamp: '2018-04-03'}, {id: '3566543aa3', tot: '34', type: 'saved', timestamp: '2018-04-03'}, {id: '4530134a97', tot: '34', type: 'gold', timestamp: '2018-04-04'}, {id: '234554b333', tot: '42', type: 'saved', timestamp: '2018-04-04'}, {id: '2463545633', tot: '55', type: 'dynamic', timestamp: '2018-04-05'}, {id: '5654324566', tot: '13', type: 'saved', timestamp: '2018-04-06'} ] let result = data.filter(o => o.type === 'saved') data.filter(o => o.type !== 'saved').forEach(g => { if (result.filter(r => r.timestamp === g.timestamp).length === 0) result.push(g) }) console.log(result)
3楼
prasanth
0
已采纳
2019-02-21 09:25:50
使用Array#Reduce
。
使用时间戳过滤数组。然后如果在新数组比较类型中存在相同的时间戳。然后只添加保存的类型对象
var arr = [ {id: 'o3134432S2', tot: '45', type: 'gold', timestamp: '2018-04-03'}, {id: '3566543aa3', tot: '34', type: 'saved', timestamp: '2018-04-03'}, {id: '4530134a97', tot: '34', type: 'gold', timestamp: '2018-04-04'}, {id: '234554b333', tot: '42', type: 'saved', timestamp: '2018-04-04'}, {id: '2463545633', tot: '55', type: 'gold', timestamp: '2018-04-05'}, {id: '5654324566', tot: '13', type: 'saved', timestamp: '2018-04-06'} ]; arr = arr.reduce(function(a,b){ var ind = a.map(i=>i.timestamp).indexOf(b.timestamp); if(ind == -1){ a.push(b); }else{ a[ind] = a[ind]['type'] == 'saved'? a[ind]:b; } return a; },[]) console.log(arr)