亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

數組組合為數組

數組組合為數組

浮云間 2023-07-06 17:24:19
我有以下數組:const data = [  [    {      "_id": "5f6a02639a62a612a172d9d0",      "level": "5f22c4af80556e32cf0ca8fb",      "name": "asia",      "relations": []    },    {      "_id": "5f6a02649a62a612a172db2f",      "level": "5f22c4af80556e32cf0ca8fb",      "name": "europe",      "relations": []    }  ],  [    {      "_id": "5f6a02639a62a612a172d9d5",      "level": "5f22c4af80556e32cf0ca8fd",      "name": "india",      "relations": [        {          "items": [            "5f6a02639a62a612a172d9d0"          ],          "level": "5f22c4af80556e32cf0ca8fb"        },        {          "items": [            "5f6a02639a62a612a172da4a"          ],          "level": "5f22c4af80556e32cf0ca8fc"        }      ]    },    {      "_id": "5f6a02649a62a612a172dba0",      "level": "5f22c4af80556e32cf0ca8fd",      "name": "italy",      "relations": [        {          "items": [            "5f6a02649a62a612a172db2f"          ],          "level": "5f22c4af80556e32cf0ca8fb"        },        {          "items": [            "5f6a02669a62a612a172e394"          ],          "level": "5f22c4af80556e32cf0ca8fc"        }      ]    },    {      "_id": "5f6a02649a62a612a172dd26",      "level": "5f22c4af80556e32cf0ca8fd",      "name": "malaysia",      "relations": [        {          "items": [            "5f6a02639a62a612a172d9d0"          ],          "level": "5f22c4af80556e32cf0ca8fb"        },        {          "items": [            "5f6a02649a62a612a172dd23"          ],          "level": "5f22c4af80556e32cf0ca8fc"        }      ]    }  ],  [    {      "_id": "5f7c8a000e746271f08f95cf",      "level": "5f22c4d180556e32cf0ca8ff",      "name": "digital",      "relations": []    }  ]];我使用以下函數給出三個數組的組合:const combinations = data.reduce((a, b) => {    return a.reduce((r, v) => {    return r.concat(b.map(w => {        return [].concat(v, w);    }));  }, []);});
查看完整描述

2 回答

?
胡說叔叔

TA貢獻1804條經驗 獲得超8個贊

您需要過濾b,而不是返回一個空數組,因為空數組并不排除實際用作結果的集合,而只是排除v和w對象并包含以下數組中的對象。


const

    data = [[{ _id: "5f6a02639a62a612a172d9d0", level: "5f22c4af80556e32cf0ca8fb", name: "asia", relations: [] }, { _id: "5f6a02649a62a612a172db2f", level: "5f22c4af80556e32cf0ca8fb", name: "europe", relations: [] }], [{ _id: "5f6a02639a62a612a172d9d5", level: "5f22c4af80556e32cf0ca8fd", name: "india", relations: [{ items: ["5f6a02639a62a612a172d9d0"], level: "5f22c4af80556e32cf0ca8fb" }, { items: ["5f6a02639a62a612a172da4a"], level: "5f22c4af80556e32cf0ca8fc" }] }, { _id: "5f6a02649a62a612a172dba0", level: "5f22c4af80556e32cf0ca8fd", name: "italy", relations: [{ items: ["5f6a02649a62a612a172db2f"], level: "5f22c4af80556e32cf0ca8fb" }, { items: ["5f6a02669a62a612a172e394"], level: "5f22c4af80556e32cf0ca8fc" }] }, { _id: "5f6a02649a62a612a172dd26", level: "5f22c4af80556e32cf0ca8fd", name: "malaysia", relations: [{ items: ["5f6a02639a62a612a172d9d0"], level: "5f22c4af80556e32cf0ca8fb" }, { items: ["5f6a02649a62a612a172dd23"], level: "5f22c4af80556e32cf0ca8fc" }] }], [{ _id: "5f7c8a000e746271f08f95cf", level: "5f22c4d180556e32cf0ca8ff", name: "digital", relations: [] }]],

    combinations = data.reduce((a, b) => {

        return a.reduce((r, v) => {

            return r.concat(b

                .filter(({ relations }) =>

                    !relations.length ||

                    relations.some(({ items, level }) => level === v.level && items[0] === v._id)

                )

                .map(w => [].concat(v, w))

            );

        }, []);

    });


console.log(combinations);

.as-console-wrapper { max-height: 100% !important; top: 0; }


查看完整回答
反對 回復 2023-07-06
?
holdtom

TA貢獻1805條經驗 獲得超10個贊

從遞歸的角度而不是從許多嵌套的數組函數的角度來思考這個問題似乎更清楚。


按命令

最簡單的情況是給出 3 個子數組中的每種可能的組合。


子數組:


1       2        3

asia    india    digital

europe  italy    

        malaysia 

獨特的組合:


1       2        3

asia    india    digital

asia    italy    digital

asia    malaysia digital

europe  india    digital

europe  italy    digital

您已經展示了如何使用數組函數來執行此操作。通過遞歸,可以實現相同的效果,如下所示:https ://jsfiddle.net/vahz3n64/

function getCombinationsByOrder() {

   let recur = (iarray) => {

      var a = [];

      var temp = [];


      if(iarray === data.length-1) {

         return (data[iarray]);

      } else {

         temp = recur(iarray + 1);


         for(var i=0;i<data[iarray].length;i++) {

            for(var j=0;j<temp.length;j++) {

               a.push([data[iarray][i], temp[j]].flat());

            };

         };


         return a;

      };

   };


   return recur(0);

};


const data = [

  [

    {

      "_id": "5f6a02639a62a612a172d9d0",

      "level": "5f22c4af80556e32cf0ca8fb",

      "name": "asia",

      "relations": []

    },

    {

      "_id": "5f6a02649a62a612a172db2f",

      "level": "5f22c4af80556e32cf0ca8fb",

      "name": "europe",

      "relations": []

    }

  ],

  [

    {

      "_id": "5f6a02639a62a612a172d9d5",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "india",

      "relations": [

        {

          "items": [

            "5f6a02639a62a612a172d9d0"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02639a62a612a172da4a"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    },

    {

      "_id": "5f6a02649a62a612a172dba0",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "italy",

      "relations": [

        {

          "items": [

            "5f6a02649a62a612a172db2f"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02669a62a612a172e394"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    },

    {

      "_id": "5f6a02649a62a612a172dd26",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "malaysia",

      "relations": [

        {

          "items": [

            "5f6a02639a62a612a172d9d0"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02649a62a612a172dd23"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    }

  ],

  [

    {

      "_id": "5f7c8a000e746271f08f95cf",

      "level": "5f22c4d180556e32cf0ca8ff",

      "name": "digital",

      "relations": []

    }

  ]

];


console.log(getCombinationsByOrder());

按級別

這是按標準進行組合。當按級別過濾時,如果在下一個子數組中的元素的數組level中找到給定元素的值,則假定包含匹配項。relations編輯:如果relations數組為空,則也包含該元素。


例如,asia第一個子數組的級別為5f22c4af80556e32cf0ca8fb。因此,india應該包含下一個子數組,因為它的relations數組中有一個包含該級別的條目。


這似乎并不是唯一的標準,但無論如何,結果將是:


1       2        3

asia    india    digital

asia    italy    digital

asia    malaysia digital

europe  india    digital

europe  italy    digital

europe  malaysia digital

這種過濾可以這樣實現: https: //jsfiddle.net/35kqbp18/

function getCombinationsByLevel() {

   let recur = (iarray, level) => {

      var a = [];

      var temp = [];

      var arr = [];


      if(level !== null) {

         for(var i=0;i<data[iarray].length;i++) {

            if(checkHasLevel(data[iarray][i], level)) {

               arr.push(data[iarray][i]);

            };

         };

      } else {

         arr = data[iarray];

      };


      if(iarray === data.length-1) {

         return (arr);

      } else {

         for(var i=0;i<arr.length;i++) {

            temp = recur(iarray + 1, arr[i].level);


            if(temp.length !== 0) {

               for(var j=0;j<temp.length;j++) {

                  a.push([arr[i], temp[j]].flat()); //parsing to prevent circular object

               };

            } else {

               a.push(arr[i]);

            }

         };


         return a;

      };

   };


   let checkHasLevel = (obj, level) => {

      if(obj.relations.length === 0) {

         return true;

      };


      for(var i=0;i<obj.relations.length;i++) {

         if(obj.relations[i].level === level) {

            return true;

         };

      };


      return false;

   };


   return recur(0, null);

};


const data = [

  [

    {

      "_id": "5f6a02639a62a612a172d9d0",

      "level": "5f22c4af80556e32cf0ca8fb",

      "name": "asia",

      "relations": []

    },

    {

      "_id": "5f6a02649a62a612a172db2f",

      "level": "5f22c4af80556e32cf0ca8fb",

      "name": "europe",

      "relations": []

    }

  ],

  [

    {

      "_id": "5f6a02639a62a612a172d9d5",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "india",

      "relations": [

        {

          "items": [

            "5f6a02639a62a612a172d9d0"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02639a62a612a172da4a"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    },

    {

      "_id": "5f6a02649a62a612a172dba0",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "italy",

      "relations": [

        {

          "items": [

            "5f6a02649a62a612a172db2f"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02669a62a612a172e394"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    },

    {

      "_id": "5f6a02649a62a612a172dd26",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "malaysia",

      "relations": [

        {

          "items": [

            "5f6a02639a62a612a172d9d0"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02649a62a612a172dd23"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    }

  ],

  [

    {

      "_id": "5f7c8a000e746271f08f95cf",

      "level": "5f22c4d180556e32cf0ca8ff",

      "name": "digital",

      "relations": []

    }

  ]

];


console.log(getCombinationsByLevel());

通過ID

這遵循與按級別過濾相同的邏輯,但使用一個元素的值并在下一個子數組中元素的數組(在 內)_id中搜索它。編輯:如果數組為空,則也包含該元素。relationsitemsrelations


例如,asia第一個子數組的 ID 為5f6a02639a62a612a172d9d0。因此,india應該包含下一個子數組,因為它的relations數組中有一個帶有該 ID 的條目。


其結果將是:


1       2        3

asia    india    digital

asia    malaysia digital

europe  italy    digital

這種過濾可以這樣實現: https: //jsfiddle.net/5apx7foq/

function getCombinationsById() {

   let recur = (iarray, id) => {

      var a = [];

      var temp = [];

      var arr = [];


      if(id !== null) {

         for(var i=0;i<data[iarray].length;i++) {

            if(checkHasId(data[iarray][i], id)) {

               arr.push(data[iarray][i]);

            };

         };

      } else {

         arr = data[iarray];

      };


      if(iarray === data.length-1) {

         return (arr);

      } else {

         for(var i=0;i<arr.length;i++) {

            temp = recur(iarray + 1, arr[i]._id);


            if(temp.length !== 0) {

               for(var j=0;j<temp.length;j++) {

                  a.push([arr[i], temp[j]].flat());

               };

            } else {

               a.push(arr[i]);

            }

         };


         return a;

      };

   };


   let checkHasId = (obj, id) => {

      if(obj.relations.length === 0) {

         return true;

      };


      for(var i=0;i<obj.relations.length;i++) {

         if(obj.relations[i].items.indexOf(id) !== -1) {

            return true;

         }

      };


      return false;

   };


   return recur(0, null);

};


const data = [

  [

    {

      "_id": "5f6a02639a62a612a172d9d0",

      "level": "5f22c4af80556e32cf0ca8fb",

      "name": "asia",

      "relations": []

    },

    {

      "_id": "5f6a02649a62a612a172db2f",

      "level": "5f22c4af80556e32cf0ca8fb",

      "name": "europe",

      "relations": []

    }

  ],

  [

    {

      "_id": "5f6a02639a62a612a172d9d5",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "india",

      "relations": [

        {

          "items": [

            "5f6a02639a62a612a172d9d0"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02639a62a612a172da4a"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    },

    {

      "_id": "5f6a02649a62a612a172dba0",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "italy",

      "relations": [

        {

          "items": [

            "5f6a02649a62a612a172db2f"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02669a62a612a172e394"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    },

    {

      "_id": "5f6a02649a62a612a172dd26",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "malaysia",

      "relations": [

        {

          "items": [

            "5f6a02639a62a612a172d9d0"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02649a62a612a172dd23"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    }

  ],

  [

    {

      "_id": "5f7c8a000e746271f08f95cf",

      "level": "5f22c4d180556e32cf0ca8ff",

      "name": "digital",

      "relations": []

    }

  ]

];


console.log(getCombinationsById());

組合標準

假設這data可能只是更多數據的樣本,可能有更多的變化,這里有一個組合函數,它可以根據使用的選項返回上述所有結果的結果。它還可以返回按 ID 和級別、或按 ID 或級別過濾的結果。


https://jsfiddle.net/xmfjh8s9/


function getCombinationsByMatch(matchId, matchLevel, matchAnd) {

   let recur = (iarray, id, level) => {

      var a = [];

      var temp = [];

      var arr = [];


      if(

         (matchId && (id !== null)) ||

         (matchLevel && (level !== null))

      ) {

         for(var i=0;i<data[iarray].length;i++) {

            if(checkMatch(data[iarray][i], id, level)) {

               arr.push(data[iarray][i]);

            };

         };

      } else {

         arr = data[iarray];

      };


      if(iarray === data.length-1) {

         return (arr);

      } else {


         for(var i=0;i<arr.length;i++) {

            temp = recur(iarray + 1, arr[i]._id, arr[i].level);


            if(temp.length !== 0) {

               for(var j=0;j<temp.length;j++) {

                  a.push([arr[i], temp[j]].flat());

               };

            } else {

               a.push(arr[i]);

            }

         };


         return a;

      };

   };


   let checkMatch = (obj, id, level) => {

      if(obj.relations.length === 0) {

         return true;

      };


      for(var i=0;i<obj.relations.length;i++) {

         if(

            (

               matchAnd && matchId && matchLevel &&

               (obj.relations[i].items.indexOf(id) !== -1) &&

               (obj.relations[i].level === level)

            ) ||

            (

               !matchAnd && matchId && matchLevel &&

               (

                  (obj.relations[i].items.indexOf(id) !== -1) ||

                  (obj.relations[i].level === level)

               )

            ) ||

            (

               matchId && !matchLevel &&

               (obj.relations[i].items.indexOf(id) !== -1)

            ) ||

            (

               !matchId && matchLevel && 

               (obj.relations[i].level === level)

            )

         ) {

            return true;

         }

      };

      

      return false;

   };


   return recur(0, null, null);

};


const data = [

  [

    {

      "_id": "5f6a02639a62a612a172d9d0",

      "level": "5f22c4af80556e32cf0ca8fb",

      "name": "asia",

      "relations": []

    },

    {

      "_id": "5f6a02649a62a612a172db2f",

      "level": "5f22c4af80556e32cf0ca8fb",

      "name": "europe",

      "relations": []

    }

  ],

  [

    {

      "_id": "5f6a02639a62a612a172d9d5",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "india",

      "relations": [

        {

          "items": [

            "5f6a02639a62a612a172d9d0"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02639a62a612a172da4a"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    },

    {

      "_id": "5f6a02649a62a612a172dba0",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "italy",

      "relations": [

        {

          "items": [

            "5f6a02649a62a612a172db2f"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02669a62a612a172e394"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    },

    {

      "_id": "5f6a02649a62a612a172dd26",

      "level": "5f22c4af80556e32cf0ca8fd",

      "name": "malaysia",

      "relations": [

        {

          "items": [

            "5f6a02639a62a612a172d9d0"

          ],

          "level": "5f22c4af80556e32cf0ca8fb"

        },

        {

          "items": [

            "5f6a02649a62a612a172dd23"

          ],

          "level": "5f22c4af80556e32cf0ca8fc"

        }

      ]

    }

  ],

  [

    {

      "_id": "5f7c8a000e746271f08f95cf",

      "level": "5f22c4d180556e32cf0ca8ff",

      "name": "digital",

      "relations": []

    }

  ]

];


console.log(getCombinationsByMatch(true, true, true));

這應該可以讓您更靈活地在 中找到不同的組合data。



查看完整回答
反對 回復 2023-07-06
  • 2 回答
  • 0 關注
  • 195 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號