【问题标题】:js delete all array element if object contain something如果对象包含某些东西,js删除所有数组元素
【发布时间】:2021-02-24 10:40:32
【问题描述】:

我有一个对象数组Course

export interface Course {
    id: string;
    student: User[];
    color: string;
}
export interface User {
    id: string;
    name: string;
    //...
}

如果他里面的学生数组包含特定的id,我需要删除Course数组的所有元素

我试图做类似的事情,但我不明白我应该在过滤器部分做什么。

const deleteCourseWhereImIn = (courses: Course[]) => {
    const myid = "1111"
    return courses.filter((item):Course => 
        //[...]
    )
};

示例:

输入:

const courses = [
    {
        id : "JSLKLDK",
        student: [
            {
                id: "1111",
                name: "John"
            },
            {
                id: "2222",
                name: "Ronald"
            },
            {
                id: "3333",
                name: "Tim"
            },
       ],
       color: "#f01000",
    },
    {
        id : "5JLDKLD",
        student: [
            {
                id: "2222",
                name: "Ronald"
            },
            {
                id: "1111",
                name: "John"
            },
       ],
       color: "#511131",
    },
    {
        id : "PDLFMLZ",
        student: [
            {
                id: "2222",
                name: "Ronald"
            },
       ],
       color: "#ffffff",
    },
]

我的 ID 是1111

输出应该是:

const courses = [
    {
        id : "PDLFMLZ",
        student: [
            {
                id: "2222",
                name: "Ronald"
            },
       ],
       color: "#ffffff",
    },
]

因为我是 john,我不在这门课程中。

【问题讨论】:

    标签: javascript arrays ecmascript-6 filter


    【解决方案1】:

    请试试这个。
    我在函数 deleteCourseWhereImIn() 中传递课程数组,然后说 myId 是“1111”。我正在检查学生数组中是否有任何学生具有此 ID,从而使用 some() 方法返回布尔值。然后根据真假过滤该特定课程。

        const deleteCourseWhereImIn = (courses: Course[]) => {
          const myId = "1111";
          let filteredCourses = courses.filter(course => {
            let studentArr = course.student;
            let filterdStudent = studentArr.some(student => student.id === myId);
            return !filterdStudent;
            
          });
        
          console.log('Filtered Course', filteredCourses);
        }
        
        deleteCourseWhereImIn(courses);  // calling function 
    

    【讨论】:

      【解决方案2】:

      您可以使用filtersome 过滤条件为id: "1111" 的课程。 在您的描述中,您提到要删除您所在的课程。

      为此,您可以在函数 deleteCourseWhereImIn 中使用此过滤器,并将其返回的内容分配给您的 Course[]

      let courses = [
          {
              id : "JSLKLDK",
              student: [
                  {
                      id: "1111",
                      name: "John"
                  },
                  {
                      id: "2222",
                      name: "Ronald"
                  },
                  {
                      id: "3333",
                      name: "Tim"
                  },
             ],
             color: "#f01000",
          },
          {
              id : "5JLDKLD",
              student: [
                  {
                      id: "2222",
                      name: "Ronald"
                  },
                  {
                      id: "1111",
                      name: "John"
                  },
             ],
             color: "#511131",
          },
          {
              id : "PDLFMLZ",
              student: [
                  {
                      id: "2222",
                      name: "Ronald"
                  },
             ],
             color: "#ffffff",
          },
      ]
      
      courses = courses.filter(course => {
          return !course.student.some(student => student.id === "1111");
      });
      
      
      console.log(courses);

      【讨论】:

        【解决方案3】:

        使用filterfindIndex

        const deleteCourseWhereImIn = (courses: Course[]) => {
            const myid = "1111";
            return courses.filter(item =>
                return item.student.findIndex(user => user.id == myid) === -1
            );
        };
        

        这里有一个详细的版本来更好地说明正在发生的事情:

        const deleteCourseWhereImIn = (courses: Course[]) => {
            const myid = "1111";
        
            const filteredCourses = courses.filter(item: Course => {
                const index = item.student.findIndex(user: User => {
                     return user.id == myid
                });
        
                // The method findIndex() will return -1 if the value you search for does not appear in the array.
                return index === -1;
            });
        
            return filteredCourses;
        };
        

        【讨论】:

          【解决方案4】:

          只使用javascript的功能特性。

          const courses = [... your courses ...]
          const idToCheck = "1111"
          let newCourses = courses.filter(x => 
              x.student.findIndex(y => y.id == idToCheck) === -1)
          

          【讨论】:

            【解决方案5】:

            最好使用reduce生成一个新数组并赋值给Course

            let courses = [
                {
                    id : "JSLKLDK",
                    student: [
                        {
                            id: "1111",
                            name: "John"
                        },
                        {
                            id: "2222",
                            name: "Ronald"
                        },
                        {
                            id: "3333",
                            name: "Tim"
                        },
                   ],
                   color: "#f01000",
                },
                {
                    id : "5JLDKLD",
                    student: [
                        {
                            id: "2222",
                            name: "Ronald"
                        },
                        {
                            id: "1111",
                            name: "John"
                        },
                   ],
                   color: "#511131",
                },
                {
                    id : "PDLFMLZ",
                    student: [
                        {
                            id: "2222",
                            name: "Ronald"
                        },
                   ],
                   color: "#ffffff",
                },
            ]
            courses = courses.reduce((arr, c)=>{
              if(!c.student.some((s)=>(s.id==='1111'))){
                arr.push(c);
              }
              return arr
            },[])
            console.log(courses);

            【讨论】:

            • 请不要只在答案中发布代码;解释它们要好得多,所以 OP 可以学到一些东西。
            • 我会更新答案,如果你喜欢你可以建议编辑
            • @Mitya 感谢投反对票,我想我以后会停止一起回答问题
            • 不要这么个人化。您的回答没有任何解释,因此完全值得一票。您现在已经添加了一些(诚然是最少的)解释,所以我收回了反对票。
            • 你为什么要我编辑?我不是为您或其他任何人解释您的答案。您现在已经完成了,否决票已撤消,让我们继续。
            【解决方案6】:

            使用filterevery

            const myID = "1111";
            
            const courses = [
                {
                    id : "JSLKLDK",
                    student: [
                        {
                            id: "1111",
                            name: "John"
                        },
                        {
                            id: "2222",
                            name: "Ronald"
                        },
                        {
                            id: "3333",
                            name: "Tim"
                        },
                   ],
                   color: "#f01000",
                },
                {
                    id : "5JLDKLD",
                    student: [
                        {
                            id: "2222",
                            name: "Ronald"
                        },
                        {
                            id: "1111",
                            name: "John"
                        },
                   ],
                   color: "#511131",
                },
                {
                    id : "PDLFMLZ",
                    student: [
                        {
                            id: "2222",
                            name: "Ronald"
                        },
                   ],
                   color: "#ffffff",
                },
            ]
            
            const filtered = courses.filter(c => c.student.every(s => s.id !== myID))
            
            console.log(filtered);

            【讨论】:

              猜你喜欢
              • 2011-12-02
              • 1970-01-01
              • 2012-05-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多