【问题标题】:How to filter item based on id and subId?如何根据 id 和 subId 过滤项目?
【发布时间】:2021-08-04 06:06:04
【问题描述】:

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

  • 如果 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 匹配,则执行相同操作。

【问题讨论】:

    标签: javascript arrays object filter


    【解决方案1】:

    试试这个,

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

    【讨论】:

    【解决方案2】:

    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}));

    【讨论】:

    • 我很困惑。您如何获得三项结果。如果条件 1 为 true,条件 2 也自动为 true
    • @Behemoth,对不起,你也让我感到困惑 ;-) 哪个是条件 1,哪个是条件 2?
    • 我说的是最初问题中提供的那些。
    • @Behemoth 你说得对。
    • @Behemoth 如果您查看提供的实现,第二个条件应该是:如果只有 id 匹配(并且我没有可用于比较的 subDataId)然后删除该项目。 (我的答案基于那个实现)
    【解决方案3】:

    我猜你有点想太多了。为什么不使用简单的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);

    【讨论】:

    • 这个答案只针对少数几个值,代码应该是动态的并且适用于所有可能的值。
    • @SajidRSK 应该吗? OP 中绝对没有提到这一点。
    【解决方案4】:

    这是我从您的描述中得出的解决方案。你可以运行 sn -p 来检查结果。

    要过滤带有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));

    【讨论】:

      【解决方案5】:

      它会检查 id 和 subDataId 是否与数据匹配或仅 id 与数据匹配。

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

      【讨论】:

        猜你喜欢
        • 2022-12-06
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        • 2020-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多