Remove object from array based on array of some property of that object2019 Community Moderator...

Faulty RAID1 disk now shows as foreign

Are small insurances worth it

Should we avoid writing fiction about historical events without extensive research?

Is there a math equivalent to the conditional ternary operator?

Remove object from array based on array of some property of that object

How to roleplay my character's ethics according to the DM when I don't understand those ethics?

Can a Tiny Servant be used as a messenger?

Why do we see a rainbow of colors reflected off a CD or DVD?

School performs periodic password audits. Is my password compromised?

The orphan's family

How can friction do no work in case of pure rolling?

Version of C# StringBuilder to allow for strings larger than 2 billion characters

Ultrafilters as a double dual

Convert an array of objects to array of the objects' values

What is the purpose of a disclaimer like "this is not legal advice"?

Can a Mimic (container form) actually hold loot?

What's the best tool for cutting holes into duct work?

Combination of causative-passive and intransive verb with a direct object?

What can I do if someone tampers with my SSH public key?

Number of folds to form a cube, using a square paper?

Quitting employee has privileged access to critical information

PTIJ: Aliyot for the deceased

Searching for a string that contains the file name

Why would the IRS ask for birth certificates or even audit a small tax return?



Remove object from array based on array of some property of that object



2019 Community Moderator ElectionDetecting an undefined object propertyCreate ArrayList from arrayHow can I merge properties of two JavaScript objects dynamically?How do I remove a property from a JavaScript object?How do I check if an array includes an object in JavaScript?PHP: Delete an element from an arraySort array of objects by string property valueHow to check if an object is an array?How do I remove a particular element from an array in JavaScript?Iterate through object properties












14















I have an array of objects (objList) that each has "id" property.



I have an array of strings (idsToRemove), representing IDs of the objects to remove from objList.



I find some solution but I fear it's slow, especially with the large list of objects with lots of properties.
Is there more efficient way to do this?






var idsToRemove = ["3", "1"];
var objList = [{
id: "1",
name: "aaa"
},
{
id: "2",
name: "bbb"
},
{
id: "3",
name: "ccc"
}
];

for (var i = 0, len = idsToRemove.length; i < len; i++) {
objList = objList.filter(o => o.id != idsToRemove[i]);
}

console.log(objList);












share|improve this question





























    14















    I have an array of objects (objList) that each has "id" property.



    I have an array of strings (idsToRemove), representing IDs of the objects to remove from objList.



    I find some solution but I fear it's slow, especially with the large list of objects with lots of properties.
    Is there more efficient way to do this?






    var idsToRemove = ["3", "1"];
    var objList = [{
    id: "1",
    name: "aaa"
    },
    {
    id: "2",
    name: "bbb"
    },
    {
    id: "3",
    name: "ccc"
    }
    ];

    for (var i = 0, len = idsToRemove.length; i < len; i++) {
    objList = objList.filter(o => o.id != idsToRemove[i]);
    }

    console.log(objList);












    share|improve this question



























      14












      14








      14








      I have an array of objects (objList) that each has "id" property.



      I have an array of strings (idsToRemove), representing IDs of the objects to remove from objList.



      I find some solution but I fear it's slow, especially with the large list of objects with lots of properties.
      Is there more efficient way to do this?






      var idsToRemove = ["3", "1"];
      var objList = [{
      id: "1",
      name: "aaa"
      },
      {
      id: "2",
      name: "bbb"
      },
      {
      id: "3",
      name: "ccc"
      }
      ];

      for (var i = 0, len = idsToRemove.length; i < len; i++) {
      objList = objList.filter(o => o.id != idsToRemove[i]);
      }

      console.log(objList);












      share|improve this question
















      I have an array of objects (objList) that each has "id" property.



      I have an array of strings (idsToRemove), representing IDs of the objects to remove from objList.



      I find some solution but I fear it's slow, especially with the large list of objects with lots of properties.
      Is there more efficient way to do this?






      var idsToRemove = ["3", "1"];
      var objList = [{
      id: "1",
      name: "aaa"
      },
      {
      id: "2",
      name: "bbb"
      },
      {
      id: "3",
      name: "ccc"
      }
      ];

      for (var i = 0, len = idsToRemove.length; i < len; i++) {
      objList = objList.filter(o => o.id != idsToRemove[i]);
      }

      console.log(objList);








      var idsToRemove = ["3", "1"];
      var objList = [{
      id: "1",
      name: "aaa"
      },
      {
      id: "2",
      name: "bbb"
      },
      {
      id: "3",
      name: "ccc"
      }
      ];

      for (var i = 0, len = idsToRemove.length; i < len; i++) {
      objList = objList.filter(o => o.id != idsToRemove[i]);
      }

      console.log(objList);





      var idsToRemove = ["3", "1"];
      var objList = [{
      id: "1",
      name: "aaa"
      },
      {
      id: "2",
      name: "bbb"
      },
      {
      id: "3",
      name: "ccc"
      }
      ];

      for (var i = 0, len = idsToRemove.length; i < len; i++) {
      objList = objList.filter(o => o.id != idsToRemove[i]);
      }

      console.log(objList);






      javascript arrays performance






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 6 hours ago









      Uwe Keim

      27.6k32132213




      27.6k32132213










      asked 8 hours ago









      DaliborDalibor

      482318




      482318
























          4 Answers
          4






          active

          oldest

          votes


















          22














          Turn the idsToRemove into a Set so that you can use Set.prototype.has (an O(1) operation), and .filter the objList just once, so that the overall complexity is O(n) (and you only iterate over the possibly-huge objList once):






          var idsToRemove = ["3", "1"];
          var objList = [{
          id: "1",
          name: "aaa"
          },
          {
          id: "2",
          name: "bbb"
          },
          {
          id: "3",
          name: "ccc"
          }
          ];

          const set = new Set(idsToRemove);
          const filtered = objList.filter(({ id }) => !set.has(id));
          console.log(filtered);





          Note that Array.prototype.includes and Array.prototype.indexOf operations are O(N), not O(1), so if you use them instead of a Set, they may take significantly longer.






          share|improve this answer

































            3














            You can use Array.includes which check if the given string exists in the given array and combine it with an Array.filter.






            const idsToRemove = ['3', '1'];

            const objList = [{
            id: '1',
            name: 'aaa',
            },
            {
            id: '2',
            name: 'bbb',
            },
            {
            id: '3',
            name: 'ccc',
            },
            ];

            const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id));

            console.log(filteredObjList);








            share|improve this answer































              3














              Simply use Array.fliter()




              const idsToRemove = ['3', '1'];

              const objList = [{
              id: '1',
              name: 'aaa',
              },
              {
              id: '2',
              name: 'bbb',
              },
              {
              id: '3',
              name: 'ccc',
              }
              ];

              const res = objList.filter(value => !idsToRemove.includes(value.id));

              console.log("result",res);








              share|improve this answer































                3














                You don't need two nested iterators if you use a built-in lookup function



                   objList = objList.filter(o => idsToRemove.indexOf(o.id) < 0);


                Documentation:



                Array.prototype.indexOf()



                Array.prototype.includes()






                share|improve this answer


























                • This leaves those I wanted to delete in the list, it should be indexOf == -1, isn't it?

                  – Dalibor
                  8 hours ago











                • Yes. Answer edited

                  – Charlie H
                  8 hours ago











                Your Answer






                StackExchange.ifUsing("editor", function () {
                StackExchange.using("externalEditor", function () {
                StackExchange.using("snippets", function () {
                StackExchange.snippets.init();
                });
                });
                }, "code-snippets");

                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "1"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: true,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: 10,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55041973%2fremove-object-from-array-based-on-array-of-some-property-of-that-object%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                4 Answers
                4






                active

                oldest

                votes








                4 Answers
                4






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                22














                Turn the idsToRemove into a Set so that you can use Set.prototype.has (an O(1) operation), and .filter the objList just once, so that the overall complexity is O(n) (and you only iterate over the possibly-huge objList once):






                var idsToRemove = ["3", "1"];
                var objList = [{
                id: "1",
                name: "aaa"
                },
                {
                id: "2",
                name: "bbb"
                },
                {
                id: "3",
                name: "ccc"
                }
                ];

                const set = new Set(idsToRemove);
                const filtered = objList.filter(({ id }) => !set.has(id));
                console.log(filtered);





                Note that Array.prototype.includes and Array.prototype.indexOf operations are O(N), not O(1), so if you use them instead of a Set, they may take significantly longer.






                share|improve this answer






























                  22














                  Turn the idsToRemove into a Set so that you can use Set.prototype.has (an O(1) operation), and .filter the objList just once, so that the overall complexity is O(n) (and you only iterate over the possibly-huge objList once):






                  var idsToRemove = ["3", "1"];
                  var objList = [{
                  id: "1",
                  name: "aaa"
                  },
                  {
                  id: "2",
                  name: "bbb"
                  },
                  {
                  id: "3",
                  name: "ccc"
                  }
                  ];

                  const set = new Set(idsToRemove);
                  const filtered = objList.filter(({ id }) => !set.has(id));
                  console.log(filtered);





                  Note that Array.prototype.includes and Array.prototype.indexOf operations are O(N), not O(1), so if you use them instead of a Set, they may take significantly longer.






                  share|improve this answer




























                    22












                    22








                    22







                    Turn the idsToRemove into a Set so that you can use Set.prototype.has (an O(1) operation), and .filter the objList just once, so that the overall complexity is O(n) (and you only iterate over the possibly-huge objList once):






                    var idsToRemove = ["3", "1"];
                    var objList = [{
                    id: "1",
                    name: "aaa"
                    },
                    {
                    id: "2",
                    name: "bbb"
                    },
                    {
                    id: "3",
                    name: "ccc"
                    }
                    ];

                    const set = new Set(idsToRemove);
                    const filtered = objList.filter(({ id }) => !set.has(id));
                    console.log(filtered);





                    Note that Array.prototype.includes and Array.prototype.indexOf operations are O(N), not O(1), so if you use them instead of a Set, they may take significantly longer.






                    share|improve this answer















                    Turn the idsToRemove into a Set so that you can use Set.prototype.has (an O(1) operation), and .filter the objList just once, so that the overall complexity is O(n) (and you only iterate over the possibly-huge objList once):






                    var idsToRemove = ["3", "1"];
                    var objList = [{
                    id: "1",
                    name: "aaa"
                    },
                    {
                    id: "2",
                    name: "bbb"
                    },
                    {
                    id: "3",
                    name: "ccc"
                    }
                    ];

                    const set = new Set(idsToRemove);
                    const filtered = objList.filter(({ id }) => !set.has(id));
                    console.log(filtered);





                    Note that Array.prototype.includes and Array.prototype.indexOf operations are O(N), not O(1), so if you use them instead of a Set, they may take significantly longer.






                    var idsToRemove = ["3", "1"];
                    var objList = [{
                    id: "1",
                    name: "aaa"
                    },
                    {
                    id: "2",
                    name: "bbb"
                    },
                    {
                    id: "3",
                    name: "ccc"
                    }
                    ];

                    const set = new Set(idsToRemove);
                    const filtered = objList.filter(({ id }) => !set.has(id));
                    console.log(filtered);





                    var idsToRemove = ["3", "1"];
                    var objList = [{
                    id: "1",
                    name: "aaa"
                    },
                    {
                    id: "2",
                    name: "bbb"
                    },
                    {
                    id: "3",
                    name: "ccc"
                    }
                    ];

                    const set = new Set(idsToRemove);
                    const filtered = objList.filter(({ id }) => !set.has(id));
                    console.log(filtered);






                    share|improve this answer














                    share|improve this answer



                    share|improve this answer








                    edited 8 hours ago

























                    answered 8 hours ago









                    CertainPerformanceCertainPerformance

                    91.5k165280




                    91.5k165280

























                        3














                        You can use Array.includes which check if the given string exists in the given array and combine it with an Array.filter.






                        const idsToRemove = ['3', '1'];

                        const objList = [{
                        id: '1',
                        name: 'aaa',
                        },
                        {
                        id: '2',
                        name: 'bbb',
                        },
                        {
                        id: '3',
                        name: 'ccc',
                        },
                        ];

                        const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id));

                        console.log(filteredObjList);








                        share|improve this answer




























                          3














                          You can use Array.includes which check if the given string exists in the given array and combine it with an Array.filter.






                          const idsToRemove = ['3', '1'];

                          const objList = [{
                          id: '1',
                          name: 'aaa',
                          },
                          {
                          id: '2',
                          name: 'bbb',
                          },
                          {
                          id: '3',
                          name: 'ccc',
                          },
                          ];

                          const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id));

                          console.log(filteredObjList);








                          share|improve this answer


























                            3












                            3








                            3







                            You can use Array.includes which check if the given string exists in the given array and combine it with an Array.filter.






                            const idsToRemove = ['3', '1'];

                            const objList = [{
                            id: '1',
                            name: 'aaa',
                            },
                            {
                            id: '2',
                            name: 'bbb',
                            },
                            {
                            id: '3',
                            name: 'ccc',
                            },
                            ];

                            const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id));

                            console.log(filteredObjList);








                            share|improve this answer













                            You can use Array.includes which check if the given string exists in the given array and combine it with an Array.filter.






                            const idsToRemove = ['3', '1'];

                            const objList = [{
                            id: '1',
                            name: 'aaa',
                            },
                            {
                            id: '2',
                            name: 'bbb',
                            },
                            {
                            id: '3',
                            name: 'ccc',
                            },
                            ];

                            const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id));

                            console.log(filteredObjList);








                            const idsToRemove = ['3', '1'];

                            const objList = [{
                            id: '1',
                            name: 'aaa',
                            },
                            {
                            id: '2',
                            name: 'bbb',
                            },
                            {
                            id: '3',
                            name: 'ccc',
                            },
                            ];

                            const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id));

                            console.log(filteredObjList);





                            const idsToRemove = ['3', '1'];

                            const objList = [{
                            id: '1',
                            name: 'aaa',
                            },
                            {
                            id: '2',
                            name: 'bbb',
                            },
                            {
                            id: '3',
                            name: 'ccc',
                            },
                            ];

                            const filteredObjList = objList.filter(x => !idsToRemove.includes(x.id));

                            console.log(filteredObjList);






                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered 8 hours ago









                            Grégory NEUTGrégory NEUT

                            9,38621940




                            9,38621940























                                3














                                Simply use Array.fliter()




                                const idsToRemove = ['3', '1'];

                                const objList = [{
                                id: '1',
                                name: 'aaa',
                                },
                                {
                                id: '2',
                                name: 'bbb',
                                },
                                {
                                id: '3',
                                name: 'ccc',
                                }
                                ];

                                const res = objList.filter(value => !idsToRemove.includes(value.id));

                                console.log("result",res);








                                share|improve this answer




























                                  3














                                  Simply use Array.fliter()




                                  const idsToRemove = ['3', '1'];

                                  const objList = [{
                                  id: '1',
                                  name: 'aaa',
                                  },
                                  {
                                  id: '2',
                                  name: 'bbb',
                                  },
                                  {
                                  id: '3',
                                  name: 'ccc',
                                  }
                                  ];

                                  const res = objList.filter(value => !idsToRemove.includes(value.id));

                                  console.log("result",res);








                                  share|improve this answer


























                                    3












                                    3








                                    3







                                    Simply use Array.fliter()




                                    const idsToRemove = ['3', '1'];

                                    const objList = [{
                                    id: '1',
                                    name: 'aaa',
                                    },
                                    {
                                    id: '2',
                                    name: 'bbb',
                                    },
                                    {
                                    id: '3',
                                    name: 'ccc',
                                    }
                                    ];

                                    const res = objList.filter(value => !idsToRemove.includes(value.id));

                                    console.log("result",res);








                                    share|improve this answer













                                    Simply use Array.fliter()




                                    const idsToRemove = ['3', '1'];

                                    const objList = [{
                                    id: '1',
                                    name: 'aaa',
                                    },
                                    {
                                    id: '2',
                                    name: 'bbb',
                                    },
                                    {
                                    id: '3',
                                    name: 'ccc',
                                    }
                                    ];

                                    const res = objList.filter(value => !idsToRemove.includes(value.id));

                                    console.log("result",res);








                                    const idsToRemove = ['3', '1'];

                                    const objList = [{
                                    id: '1',
                                    name: 'aaa',
                                    },
                                    {
                                    id: '2',
                                    name: 'bbb',
                                    },
                                    {
                                    id: '3',
                                    name: 'ccc',
                                    }
                                    ];

                                    const res = objList.filter(value => !idsToRemove.includes(value.id));

                                    console.log("result",res);





                                    const idsToRemove = ['3', '1'];

                                    const objList = [{
                                    id: '1',
                                    name: 'aaa',
                                    },
                                    {
                                    id: '2',
                                    name: 'bbb',
                                    },
                                    {
                                    id: '3',
                                    name: 'ccc',
                                    }
                                    ];

                                    const res = objList.filter(value => !idsToRemove.includes(value.id));

                                    console.log("result",res);






                                    share|improve this answer












                                    share|improve this answer



                                    share|improve this answer










                                    answered 8 hours ago









                                    Khyati SharmaKhyati Sharma

                                    1306




                                    1306























                                        3














                                        You don't need two nested iterators if you use a built-in lookup function



                                           objList = objList.filter(o => idsToRemove.indexOf(o.id) < 0);


                                        Documentation:



                                        Array.prototype.indexOf()



                                        Array.prototype.includes()






                                        share|improve this answer


























                                        • This leaves those I wanted to delete in the list, it should be indexOf == -1, isn't it?

                                          – Dalibor
                                          8 hours ago











                                        • Yes. Answer edited

                                          – Charlie H
                                          8 hours ago
















                                        3














                                        You don't need two nested iterators if you use a built-in lookup function



                                           objList = objList.filter(o => idsToRemove.indexOf(o.id) < 0);


                                        Documentation:



                                        Array.prototype.indexOf()



                                        Array.prototype.includes()






                                        share|improve this answer


























                                        • This leaves those I wanted to delete in the list, it should be indexOf == -1, isn't it?

                                          – Dalibor
                                          8 hours ago











                                        • Yes. Answer edited

                                          – Charlie H
                                          8 hours ago














                                        3












                                        3








                                        3







                                        You don't need two nested iterators if you use a built-in lookup function



                                           objList = objList.filter(o => idsToRemove.indexOf(o.id) < 0);


                                        Documentation:



                                        Array.prototype.indexOf()



                                        Array.prototype.includes()






                                        share|improve this answer















                                        You don't need two nested iterators if you use a built-in lookup function



                                           objList = objList.filter(o => idsToRemove.indexOf(o.id) < 0);


                                        Documentation:



                                        Array.prototype.indexOf()



                                        Array.prototype.includes()







                                        share|improve this answer














                                        share|improve this answer



                                        share|improve this answer








                                        edited 8 hours ago

























                                        answered 8 hours ago









                                        Charlie HCharlie H

                                        9,48442653




                                        9,48442653













                                        • This leaves those I wanted to delete in the list, it should be indexOf == -1, isn't it?

                                          – Dalibor
                                          8 hours ago











                                        • Yes. Answer edited

                                          – Charlie H
                                          8 hours ago



















                                        • This leaves those I wanted to delete in the list, it should be indexOf == -1, isn't it?

                                          – Dalibor
                                          8 hours ago











                                        • Yes. Answer edited

                                          – Charlie H
                                          8 hours ago

















                                        This leaves those I wanted to delete in the list, it should be indexOf == -1, isn't it?

                                        – Dalibor
                                        8 hours ago





                                        This leaves those I wanted to delete in the list, it should be indexOf == -1, isn't it?

                                        – Dalibor
                                        8 hours ago













                                        Yes. Answer edited

                                        – Charlie H
                                        8 hours ago





                                        Yes. Answer edited

                                        – Charlie H
                                        8 hours ago


















                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Stack Overflow!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55041973%2fremove-object-from-array-based-on-array-of-some-property-of-that-object%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        Installing LyX: “No textclass is found.”LyX installation error- text class not found- 'Reconfigure' or...

                                        (1602) Indiana Índice Designación y nombre Características orbitales Véase...

                                        Universidad Autónoma de Occidente Índice Historia Campus Facultades Programas Académicos Medios de...