【问题标题】:Javascript filter not working for multiple conditionJavascript过滤器不适用于多种条件
【发布时间】:2021-06-09 07:30:07
【问题描述】:

我正在尝试根据某些条件过滤对象数组。如果我应用单一条件,它会起作用,但如果我应用更多条件,它就不起作用!!。我不明白为什么它不适用于多种条件。下面是我的代码。

const removeItemIfConditationMatch = () => {
  let filter = [];
  filter = arr.filter(
    item => item.id !== myObj.id && 
    item.level !== myObj.level && 
    item.technology !== myObj.technology && 
    item.type !== myObj.type)
  console.log(filter)
}

let myObj = {
  "questions": [],
  "technology": "Can_Js",
  "type": "NON_CODE",
  "level": "EASY",
  "id": 0
}
let arr = [{
    "questions": [],
    "technology": "Can_Js",
    "type": "NON_CODE",
    "level": "EASY",
    "id": 0
  },
  {
    "questions": [],
    "technology": "Network_Simulator",
    "type": "NON_CODE",
    "level": "EASY",
    "id": 1
  },
  {
    "questions": [],
    "technology": "Java",
    "type": "NON_CODE",
    "level": "HIGH",
    "id": 0
  },
  {
    "questions": [],
    "technology": "Java",
    "type": "CODE",
    "level": "HIGH",
    "id": 1
  },
  {
    "questions": [],
    "technology": "React Js",
    "type": "NON_CODE",
    "level": "MEDIUM",
    "id": 1
  }
]
removeItemIfConditationMatch()

在上面的代码中,如果我在单一条件下进行过滤,它可以工作,但如果你运行上面的代码,它就不会工作。任何人都知道为什么它在我做错的地方不起作用。任何帮助将不胜感激。

应用我的多重过滤条件后,我期望得到以下结果。

[
    {
        "questions": [],
        "technology": "Network_Simulator",
        "type": "NON_CODE",
        "level": "EASY",
        "id": 1
    },
    {
        "questions": [],
        "technology": "Java",
        "type": "NON_CODE",
        "level": "HIGH",
        "id": 0
    },
    {
        "questions": [],
        "technology": "Java",
        "type": "CODE",
        "level": "HIGH",
        "id": 1
    },
    {
        "questions": [],
        "technology": "React Js",
        "type": "NON_CODE",
        "level": "MEDIUM",
        "id": 1
    }
]

简而言之,我期待如果我的条件匹配,然后从数组列表中删除该对象。

【问题讨论】:

    标签: javascript ecmascript-6 filter


    【解决方案1】:

    尝试将条件替换为:

    filter = arr.filter(item => !(item.id == myObj.id &&
                        item.level == myObj.level && 
                        item.technology == myObj.technology && 
                        item.type == myObj.type))
    

    在您的代码中,原始过滤器会删除 ANY 字段等于 myObj 对象中的值的所有对象。在建议的代码中,过滤器功能会删除所有字段不等于myObj 中的字段的对象。

    问题出在这里:如果你想从具有条件的数组中删除值:

       item.id !== myObj.id && item.level !== myObj.level ...
    

    如果 id 字段不相等,则 JS 停止验证条件并将此元素从结果数组中删除。

    【讨论】:

      【解决方案2】:

      const removeItemIfConditationMatch = () => {
        let filter = [];
        filter = arr.filter(
          item => item.id !== myObj.id || 
          item.level !== myObj.level || 
          item.technology !== myObj.technology || 
          item.type !== myObj.type)
        console.log(filter)
      }
      
      let myObj = {
        "questions": [],
        "technology": "Can_Js",
        "type": "NON_CODE",
        "level": "EASY",
        "id": 0
      }
      let arr = [{
          "questions": [],
          "technology": "Can_Js",
          "type": "NON_CODE",
          "level": "EASY",
          "id": 0
        },
        {
          "questions": [],
          "technology": "Network_Simulator",
          "type": "NON_CODE",
          "level": "EASY",
          "id": 1
        },
        {
          "questions": [],
          "technology": "Java",
          "type": "NON_CODE",
          "level": "HIGH",
          "id": 0
        },
        {
          "questions": [],
          "technology": "Java",
          "type": "CODE",
          "level": "HIGH",
          "id": 1
        },
        {
          "questions": [],
          "technology": "React Js",
          "type": "NON_CODE",
          "level": "MEDIUM",
          "id": 1
        }
      ]
      removeItemIfConditationMatch()

      【讨论】:

      【解决方案3】:

      const removeItemIfConditationMatch = () => {
        let filter = [];
        let myObj = {
          questions: [],
          technology: "Can_Js",
          type: "NON_CODE",
          level: "EASY",
          id: 0,
        };
        let arr = [
          {
            questions: [],
            technology: "Can_Js",
            type: "NON_CODE",
            level: "EASY",
            id: 0,
          },
          {
            questions: [],
            technology: "Network_Simulator",
            type: "NON_CODE",
            level: "EASY",
            id: 1,
          },
          {
            questions: [],
            technology: "Java",
            type: "NON_CODE",
            level: "HIGH",
            id: 0,
          },
          {
            questions: [],
            technology: "Java",
            type: "CODE",
            level: "HIGH",
            id: 1,
          },
          {
            questions: [],
            technology: "React Js",
            type: "NON_CODE",
            level: "MEDIUM",
            id: 1,
          },
        ];
        filter = arr.filter(
          (item) =>
            item.id !== myObj.id ||
            item.level !== myObj.level ||
            item.technology !== myObj.technology ||
            item.type !== myObj.type
        );
        console.log(filter);
      };
      
      removeItemIfConditationMatch();

      【讨论】:

        【解决方案4】:

        尝试使用此过滤器

        arr.filter((item) => JSON.stringify(item) !== JSON.stringify(myObj));
        

        请记住,在您的解决方案中,您指定了多个条件,这些条件通常会在 JavaScript 中出现意外行为。逻辑是反转的,因此您必须使用|| 而不是&&

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多