Javascript - Remove duplicate arrays from a set












1















I have an array of arrays.



let myArr = [[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]];


I want to filter all repeating arrays in myArr so it stores only unique ones:



let myArr = [[1,2,3],[3,4,5],[5,6,7]];


I thought that by converting myArr into a set it would clear all 'duplicate' values, however, it did not:



let mySet = new Set(myArr);
// Set is: {[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]}


How can I properly filter myArr to hold only unique elements?










share|improve this question


















  • 1





    equality for arrays is not well defined, for example, are these "equal": [1,2,3] vs [1,,2,,3]? Or [1,"2"] vs ["1",2]?

    – georg
    Nov 21 '18 at 21:06


















1















I have an array of arrays.



let myArr = [[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]];


I want to filter all repeating arrays in myArr so it stores only unique ones:



let myArr = [[1,2,3],[3,4,5],[5,6,7]];


I thought that by converting myArr into a set it would clear all 'duplicate' values, however, it did not:



let mySet = new Set(myArr);
// Set is: {[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]}


How can I properly filter myArr to hold only unique elements?










share|improve this question


















  • 1





    equality for arrays is not well defined, for example, are these "equal": [1,2,3] vs [1,,2,,3]? Or [1,"2"] vs ["1",2]?

    – georg
    Nov 21 '18 at 21:06
















1












1








1








I have an array of arrays.



let myArr = [[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]];


I want to filter all repeating arrays in myArr so it stores only unique ones:



let myArr = [[1,2,3],[3,4,5],[5,6,7]];


I thought that by converting myArr into a set it would clear all 'duplicate' values, however, it did not:



let mySet = new Set(myArr);
// Set is: {[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]}


How can I properly filter myArr to hold only unique elements?










share|improve this question














I have an array of arrays.



let myArr = [[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]];


I want to filter all repeating arrays in myArr so it stores only unique ones:



let myArr = [[1,2,3],[3,4,5],[5,6,7]];


I thought that by converting myArr into a set it would clear all 'duplicate' values, however, it did not:



let mySet = new Set(myArr);
// Set is: {[1,2,3],[1,2,3],[3,4,5],[5,6,7],[5,6,7]}


How can I properly filter myArr to hold only unique elements?







javascript arrays duplicates set






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 21 '18 at 20:51









EDJEDJ

193215




193215








  • 1





    equality for arrays is not well defined, for example, are these "equal": [1,2,3] vs [1,,2,,3]? Or [1,"2"] vs ["1",2]?

    – georg
    Nov 21 '18 at 21:06
















  • 1





    equality for arrays is not well defined, for example, are these "equal": [1,2,3] vs [1,,2,,3]? Or [1,"2"] vs ["1",2]?

    – georg
    Nov 21 '18 at 21:06










1




1





equality for arrays is not well defined, for example, are these "equal": [1,2,3] vs [1,,2,,3]? Or [1,"2"] vs ["1",2]?

– georg
Nov 21 '18 at 21:06







equality for arrays is not well defined, for example, are these "equal": [1,2,3] vs [1,,2,,3]? Or [1,"2"] vs ["1",2]?

– georg
Nov 21 '18 at 21:06














4 Answers
4






active

oldest

votes


















2














You could take stringed arrays as value for the set and map then the arrays back.






var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
unique = Array.from(
new Set(array.map(a => JSON.stringify(a))),
json => JSON.parse(json)
);

console.log(unique);





If you need the original arrays, then you could filter with a Set.






var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
unique = array.filter(
(s => a => (j => !s.has(j) || s.set(j))(JSON.stringify(a)))
(new Set)
);

console.log(unique);








share|improve this answer































    1














    You can use JSON to identify duplicates in a set and keep only the unique arrays in your list.



    const elem_sets = new Set();
    const result = arr.filter(item => !elem_sets.has(JSON.stringify(item)) ? elem_sets.add(JSON.stringify(item)) : false);

    console.log(result);





    share|improve this answer































      0














      Try this:



       function remove(myArr) {
      let s = new Set(myArr);
      let it = s.values();
      return Array.from(it);
      }





      share|improve this answer































        0














        You can also solve this with a single Array.reduce where you group on the Array.toString():






        const data = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]]

        const r = Object.values(data.reduce((r,c) => (r[c.toString()] = c, r), {}))

        console.log(r)








        share|improve this answer

























          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%2f53420290%2fjavascript-remove-duplicate-arrays-from-a-set%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









          2














          You could take stringed arrays as value for the set and map then the arrays back.






          var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
          unique = Array.from(
          new Set(array.map(a => JSON.stringify(a))),
          json => JSON.parse(json)
          );

          console.log(unique);





          If you need the original arrays, then you could filter with a Set.






          var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
          unique = array.filter(
          (s => a => (j => !s.has(j) || s.set(j))(JSON.stringify(a)))
          (new Set)
          );

          console.log(unique);








          share|improve this answer




























            2














            You could take stringed arrays as value for the set and map then the arrays back.






            var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
            unique = Array.from(
            new Set(array.map(a => JSON.stringify(a))),
            json => JSON.parse(json)
            );

            console.log(unique);





            If you need the original arrays, then you could filter with a Set.






            var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
            unique = array.filter(
            (s => a => (j => !s.has(j) || s.set(j))(JSON.stringify(a)))
            (new Set)
            );

            console.log(unique);








            share|improve this answer


























              2












              2








              2







              You could take stringed arrays as value for the set and map then the arrays back.






              var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
              unique = Array.from(
              new Set(array.map(a => JSON.stringify(a))),
              json => JSON.parse(json)
              );

              console.log(unique);





              If you need the original arrays, then you could filter with a Set.






              var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
              unique = array.filter(
              (s => a => (j => !s.has(j) || s.set(j))(JSON.stringify(a)))
              (new Set)
              );

              console.log(unique);








              share|improve this answer













              You could take stringed arrays as value for the set and map then the arrays back.






              var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
              unique = Array.from(
              new Set(array.map(a => JSON.stringify(a))),
              json => JSON.parse(json)
              );

              console.log(unique);





              If you need the original arrays, then you could filter with a Set.






              var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
              unique = array.filter(
              (s => a => (j => !s.has(j) || s.set(j))(JSON.stringify(a)))
              (new Set)
              );

              console.log(unique);








              var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
              unique = Array.from(
              new Set(array.map(a => JSON.stringify(a))),
              json => JSON.parse(json)
              );

              console.log(unique);





              var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
              unique = Array.from(
              new Set(array.map(a => JSON.stringify(a))),
              json => JSON.parse(json)
              );

              console.log(unique);





              var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
              unique = array.filter(
              (s => a => (j => !s.has(j) || s.set(j))(JSON.stringify(a)))
              (new Set)
              );

              console.log(unique);





              var array = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]],
              unique = array.filter(
              (s => a => (j => !s.has(j) || s.set(j))(JSON.stringify(a)))
              (new Set)
              );

              console.log(unique);






              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Nov 21 '18 at 20:54









              Nina ScholzNina Scholz

              193k15107178




              193k15107178

























                  1














                  You can use JSON to identify duplicates in a set and keep only the unique arrays in your list.



                  const elem_sets = new Set();
                  const result = arr.filter(item => !elem_sets.has(JSON.stringify(item)) ? elem_sets.add(JSON.stringify(item)) : false);

                  console.log(result);





                  share|improve this answer




























                    1














                    You can use JSON to identify duplicates in a set and keep only the unique arrays in your list.



                    const elem_sets = new Set();
                    const result = arr.filter(item => !elem_sets.has(JSON.stringify(item)) ? elem_sets.add(JSON.stringify(item)) : false);

                    console.log(result);





                    share|improve this answer


























                      1












                      1








                      1







                      You can use JSON to identify duplicates in a set and keep only the unique arrays in your list.



                      const elem_sets = new Set();
                      const result = arr.filter(item => !elem_sets.has(JSON.stringify(item)) ? elem_sets.add(JSON.stringify(item)) : false);

                      console.log(result);





                      share|improve this answer













                      You can use JSON to identify duplicates in a set and keep only the unique arrays in your list.



                      const elem_sets = new Set();
                      const result = arr.filter(item => !elem_sets.has(JSON.stringify(item)) ? elem_sets.add(JSON.stringify(item)) : false);

                      console.log(result);






                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Nov 21 '18 at 20:58









                      nitrodmrnitrodmr

                      16316




                      16316























                          0














                          Try this:



                           function remove(myArr) {
                          let s = new Set(myArr);
                          let it = s.values();
                          return Array.from(it);
                          }





                          share|improve this answer




























                            0














                            Try this:



                             function remove(myArr) {
                            let s = new Set(myArr);
                            let it = s.values();
                            return Array.from(it);
                            }





                            share|improve this answer


























                              0












                              0








                              0







                              Try this:



                               function remove(myArr) {
                              let s = new Set(myArr);
                              let it = s.values();
                              return Array.from(it);
                              }





                              share|improve this answer













                              Try this:



                               function remove(myArr) {
                              let s = new Set(myArr);
                              let it = s.values();
                              return Array.from(it);
                              }






                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered Nov 21 '18 at 20:55









                              AkramAkram

                              60231324




                              60231324























                                  0














                                  You can also solve this with a single Array.reduce where you group on the Array.toString():






                                  const data = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]]

                                  const r = Object.values(data.reduce((r,c) => (r[c.toString()] = c, r), {}))

                                  console.log(r)








                                  share|improve this answer






























                                    0














                                    You can also solve this with a single Array.reduce where you group on the Array.toString():






                                    const data = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]]

                                    const r = Object.values(data.reduce((r,c) => (r[c.toString()] = c, r), {}))

                                    console.log(r)








                                    share|improve this answer




























                                      0












                                      0








                                      0







                                      You can also solve this with a single Array.reduce where you group on the Array.toString():






                                      const data = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]]

                                      const r = Object.values(data.reduce((r,c) => (r[c.toString()] = c, r), {}))

                                      console.log(r)








                                      share|improve this answer















                                      You can also solve this with a single Array.reduce where you group on the Array.toString():






                                      const data = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]]

                                      const r = Object.values(data.reduce((r,c) => (r[c.toString()] = c, r), {}))

                                      console.log(r)








                                      const data = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]]

                                      const r = Object.values(data.reduce((r,c) => (r[c.toString()] = c, r), {}))

                                      console.log(r)





                                      const data = [[1, 2, 3], [1, 2, 3], [3, 4, 5], [5, 6, 7], [5, 6, 7]]

                                      const r = Object.values(data.reduce((r,c) => (r[c.toString()] = c, r), {}))

                                      console.log(r)






                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited Nov 21 '18 at 21:33

























                                      answered Nov 21 '18 at 21:27









                                      AkrionAkrion

                                      9,54011224




                                      9,54011224






























                                          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%2f53420290%2fjavascript-remove-duplicate-arrays-from-a-set%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

                                          Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

                                          ComboBox Display Member on multiple fields

                                          Is it possible to collect Nectar points via Trainline?