如何根据id和subId筛选项目



嘿,我正在制作一个送餐应用程序,我有一个数据列表。如果条件匹配,我想删除该项目:

  • 如果idsubDataId匹配,则删除该项
  • 如果只有id匹配(并且我没有可以用于比较的subDataId),则删除该项

这是我的数据

state: [
{
id: 1,
quantity: 4,
price: 120,
subDataId: 1,
itemTotalPrice: 480
},
{
id: 1,
quantity: 5,
price: 70,
subDataId: 2,
itemTotalPrice: 350
},
{
id: 2,
quantity: 3,
price: 140,
subDataId: 1,
itemTotalPrice: 420
},
{
id: 2,
quantity: 5,
price: 80,
subDataId: 2,
itemTotalPrice: 400
},
{
id: 3,
quantity: 6,
price: 60,
itemTotalPrice: 360
}
],

这是我的代码

let data = {id: 1, subDataId: 2};
// let data ={id: 3}
if (data.subDataId) {
const filtered = state.filter((filterItem) => {
return (
filterItem.id !== data.id && filterItem.subDataId !== data.subDataId
);        });
if (filtered.length !== 0) {
return (state = filtered);
} else {
return [...state];
}
} else {
const filtered = state.filter((filterItem) => {
return filterItem.id !== data.id;
});
if (filtered.length !== 0) {
return (state = filtered);
} else {
return [...state];
}
}

代码工作不正常,删除了几个项而不是一个。

EDIT伙计们,伙计们,我想检查idsubdDataId是否匹配,然后删除该项目并返回一个包含其余数据的数组,如果只有id=匹配,则执行相同操作。

试试这个,

let newState = state.filter((item) =>{
return item.id !== data.id && item.subDataId !== data.subDataId; 
});

filterItem.id !== data.id && filterItem.subDataId !== data.subDataId不正确。如果id和subDataId匹配,即filterItem.id === data.id && filterItem.subDataId === data.subDataId,则需要删除该项。因此,如果!(filterItem.id === data.id && filterItem.subDataId === data.subDataId)

const state = [
{
id: 1,
quantity: 4,
price: 120,
subDataId: 1,
itemTotalPrice: 480
},
{
id: 1,
quantity: 5,
price: 70,
subDataId: 2,
itemTotalPrice: 350
},
{
id: 2,
quantity: 3,
price: 140,
subDataId: 1,
itemTotalPrice: 420
},
{
id: 2,
quantity: 5,
price: 80,
subDataId: 2,
itemTotalPrice: 400
},
{
id: 3,
quantity: 6,
price: 60,
itemTotalPrice: 360
}
];
function filter(data) {
if (data.subDataId) {
const filtered = state.filter((filterItem) => 
!(filterItem.id === data.id && filterItem.subDataId === data.subDataId));
if (filtered.length !== 0) {
return filtered;
} else {
return [...state];
}
} else {
const filtered = state.filter((filterItem) => {
return filterItem.id !== data.id;
});
if (filtered.length !== 0) {
return filtered;
} else {
return [...state];
}
}
}
console.log(filter({id:1, subDataId:2}));
console.log(filter({id:1}));

我想你有点想得太多了。为什么不使用简单的filter()?在您的解释中,条件2是true,条件1是true。所以实际情况是:

  • 项目id&subDataId必须与要删除的值相匹配

试试这个:

const data = [{
id: 1,
quantity: 4,
price: 120,
subDataId: 1,
itemTotalPrice: 480,
},
{
id: 1,
quantity: 5,
price: 70,
subDataId: 2,
itemTotalPrice: 350,
},
{
id: 2,
quantity: 3,
price: 140,
subDataId: 1,
itemTotalPrice: 420,
},
{
id: 2,
quantity: 5,
price: 80,
subDataId: 2,
itemTotalPrice: 400,
},
{
id: 3,
quantity: 6,
price: 60,
itemTotalPrice: 360,
},
];
const result = data.filter((item) => item.id !== 1 && item.subDataId !== 2);
console.log(result);

这是我根据您的描述提出的解决方案。您可以运行代码段来检查结果。

要使用subDataId筛选项目,必须使用||而不是&&

const state = [
{
id: 1,
quantity: 4,
price: 120,
subDataId: 1,
itemTotalPrice: 480,
},
{
id: 1,
quantity: 5,
price: 70,
subDataId: 2,
itemTotalPrice: 350,
},
{
id: 2,
quantity: 3,
price: 140,
subDataId: 1,
itemTotalPrice: 420,
},
{
id: 2,
quantity: 5,
price: 80,
subDataId: 2,
itemTotalPrice: 400,
},
{
id: 3,
quantity: 6,
price: 60,
itemTotalPrice: 360,
},
];
function filterItem(data, itemToRemove) {
let filteredData = [...data];
// we are checking if itemToRemove has subDataId
if (itemToRemove.subDataId) {
// we are only taking an item if it's id or subDataId doesn't match with itemToRemove's id or subDataId
filteredData = data.filter(
(item) =>
item.id !== itemToRemove.id || item.subDataId !== itemToRemove.subDataId
);
} else {
// if itemToRemove doesn't have subDataId we are only taking an item if it's id doesn't match with itemToRemove's id
filteredData = data.filter((item) => item.id !== itemToRemove.id);
}
return filteredData;
}
const item1 = { id: 1};
const item2 = { id: 1, subDataId: 1 };
console.log('Without subDataId', filterItem(state, item1));
console.log('With subDataId', filterItem(state, item2));

它将检查id和subDataId是否与数据匹配,或者只是id与数据匹配。

const filteredArary = state.filter(item => !((item.id === data.id && item.subDataIdd === data.subDataId) || item.id === data.id))

最新更新