gpt4 book ai didi

javascript - 复杂场景下如何过滤重复行

转载 作者:行者123 更新时间:2023-12-01 00:49:05 24 4
gpt4 key购买 nike

我想过滤一些复杂场景的重复行。

例如1:

ID和Code ID相同,并且状态为“不可预订”或“可预订”,我们将删除状态为“可预订”的ID和Code ID

例如2:

ID和Code ID相同,并且状态为“已完成”或“可预订”,我们将删除状态为“已完成”的ID和Code ID

例如3:

如果2个I​​D相同,并且Code ID不同,我们将在列表中显示两者

var new data = [{
ID: 150042379,
Name: Cake 1234
Status: 'Not Reservable'
Code ID: 302
},
{
ID: 150042379,
Name: Cake 1234
Status: 'Reservable'
Code ID: 302
},
{
ID: 150042379,
Name: Bread 1236 Ticket
Status: 'Reservable'
Code ID: 391
},
{
ID: 150053213,
Name: Bread Basic 8
Status: 'Reservable'
Code ID: 201
},
{
ID: 150053213,
Name: Bread Basic 6
Status: 'Reservable'
Code ID: 301
},
{
ID: 150054121,
Name: Bread Basic 16
Status: 'Not Reservable'
Code ID: 202
},
{
ID: 150054121,
Name: Bread Basic 16
Status: 'Reservable'
Code ID: 202
},
{
ID: 150057599,
Name: Bread Riche
Status: 'Reservable'
Code ID: 232
},
]
<小时/>

所以我想要的结果:

var filter_new_data = [{
ID: 150042379,
Name: Cake 1234
Status: 'Not Reservable'
Code ID: 302
},
{
ID: 150042379,
Name: Bread 1236 Ticket
Status: 'Reservable'
Code ID: 391
},
{
ID: 150053213,
Name: Bread Basic 8
Status: 'Reservable'
Code ID: 201
},
{
ID: 150053213,
Name: Bread Basic 6
Status: 'Reservable'
Code ID: 301
},
{
ID: 150054121,
Name: Bread Basic 16
Status: 'Not Reservable'
Code ID: 202
},
{
ID: 150057599,
Name: Bread Riche
Status: 'Reservable'
Code ID: 232
},
]
<小时/>

这是我当前的代码,我卡在了一半

filter_new_data = Object.values(new_data.reduce((acc, value) => {
if (acc[value.ID]) {
if (acc[value.ID].STATUS === 'Not Reservable') {
acc[value.ID] = acc[value.ID]
} else if (acc[value.ID].STATUS === 'Reservable') {
acc[value.ID] = acc[value.ID]
} else {
acc[value.ID] = value
}
} else {
acc[value.ID] = value
}
return acc
}, {}))

最佳答案

我采取了与@charlietfl类似的方法,但他更快。 ;)

const STATUSES = {
'Not Reservable': 30,
'Reservable': 20,
'Completed': 10,
}

var dataMap = new Map()

data.forEach((ele)=>{
let {ID, 'Code ID': codeID, Status} = ele
let key = `${ID}:${codeID}`
if (!dataMap.has(key)) {
dataMap.set(key, ele)
} else {
let stored = dataMap.get(key)
// If the current ele.Status Value greater than store.Status Value then over write
if (STATUSES[Status] > STATUSES[stored.Status]) dataMap.set(key, ele)
}
})
var results = Array.from(dataMap).map(ele=>ele[1])
console.log(JSON.stringify(results,null,2))

var data = [{
ID: 150042379,
Name: 'Cake 1234',
Status: 'Not Reservable',
'Code ID': 302
},
{
ID: 150042379,
Name: 'Cake 1234',
Status: 'Reservable',
'Code ID': 302
},
{
ID: 150042379,
Name: 'Bread 1236 Ticket',
Status: 'Reservable',
'Code ID': 391
},
{
ID: 150053213,
Name: 'Bread Basic 8',
Status: 'Reservable',
'Code ID': 201
},
{
ID: 150053213,
Name: 'Bread Basic 6',
Status: 'Reservable',
'Code ID': 301
},
{
ID: 150054121,
Name: 'Bread Basic 16',
Status: 'Not Reservable',
'Code ID': 202
},
{
ID: 150054121,
Name: 'Bread Basic 16',
Status: 'Reservable',
'Code ID': 202
},
{
ID: 150057599,
Name: 'Bread Riche',
Status: 'Reservable',
'Code ID': 232
},
]

const STATUSES = {
'Not Reservable': 30,
'Reservable': 20,
'Completed': 10,
}

var dataMap = new Map()

data.forEach((ele)=>{
let {ID, 'Code ID': codeID, Status} = ele
let key = `${ID}:${codeID}`
if (!dataMap.has(key)) {
dataMap.set(key, ele)
} else {
let stored = dataMap.get(key)
// If the current ele.Status Value greater than store.Status Value then over write
if (STATUSES[Status] > STATUSES[stored.Status]) dataMap.set(key, ele)
}
})
var results = Array.from(dataMap).map(ele=>ele[1])
console.log(JSON.stringify(results,null,2))

关于javascript - 复杂场景下如何过滤重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57134879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com