1

我有以下数组:

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);
    }));
  }, []);
});

组合的结果是:

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

上面的函数生成所有数组值的组合,现在我想根据一些条件生成组合,我想根据关系属性生成它,所以我可以得到以下结果:

[
  [
    {
      "_id": "5f6a02639a62a612a172d9d0",
      "level": "5f22c4af80556e32cf0ca8fb",
      "name": "asia",
      "relations": []
    },
    {
      "_id": "5f6a02639a62a612a172d9d5",
      "level": "5f22c4af80556e32cf0ca8fd",
      "name": "india",
      "relations": [
        {
          "items": [
            "5f6a02639a62a612a172d9d0"
          ],
          "level": "5f22c4af80556e32cf0ca8fb"
        },
        {
          "items": [
            "5f6a02639a62a612a172da4a"
          ],
          "level": "5f22c4af80556e32cf0ca8fc"
        }
      ]
    },
    {
      "_id": "5f7c8a000e746271f08f95cf",
      "level": "5f22c4d180556e32cf0ca8ff",
      "name": "digital",
      "relations": []
    }
  ],
  [
    {
      "_id": "5f6a02639a62a612a172d9d0",
      "level": "5f22c4af80556e32cf0ca8fb",
      "name": "asia",
      "relations": []
    },
    {
      "_id": "5f6a02649a62a612a172dd26",
      "level": "5f22c4af80556e32cf0ca8fd",
      "name": "malaysia",
      "relations": [
        {
          "items": [
            "5f6a02639a62a612a172d9d0"
          ],
          "level": "5f22c4af80556e32cf0ca8fb"
        },
        {
          "items": [
            "5f6a02649a62a612a172dd23"
          ],
          "level": "5f22c4af80556e32cf0ca8fc"
        }
      ]
    },
    {
      "_id": "5f7c8a000e746271f08f95cf",
      "level": "5f22c4d180556e32cf0ca8ff",
      "name": "digital",
      "relations": []
    }
  ],
  [
    {
      "_id": "5f6a02649a62a612a172db2f",
      "level": "5f22c4af80556e32cf0ca8fb",
      "name": "europe",
      "relations": []
    },
    {
      "_id": "5f6a02649a62a612a172dba0",
      "level": "5f22c4af80556e32cf0ca8fd",
      "name": "italy",
      "relations": [
        {
          "items": [
            "5f6a02649a62a612a172db2f"
          ],
          "level": "5f22c4af80556e32cf0ca8fb"
        },
        {
          "items": [
            "5f6a02669a62a612a172e394"
          ],
          "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 => {
      let m = true;
      if (w.relations.length) {
        const relations = w.relations.map(relation => ({ level: relation.level, id: relation.items[0] }));
        const relation = relations.find(relation => relation.level === v.level);
        if (relation.id !== v._id) {
                    m = false;
                }
      }
        return m ? [].concat(v, w) : [];
    }));
  }, []);
});

但它没有正常工作!

编辑 !! 我发现当接受的答案返回一个空数组时。

const data = [
    [
        {
            _id: "5fac3f7cbcdd470fb3589e85",
            level: "5f22c4af80556e32cf0ca8fb",
            name: "international",
            relations: []
        }
    ],
    [
        {
            _id: "5fac3f7cbcdd470fb3589e87",
            level: "5f22c4af80556e32cf0ca8fc",
            name: "india mco",
            relations: [
                {
                    items: ["5fac3f7cbcdd470fb3589e85"],
                    level: "5f22c4af80556e32cf0ca8fb",
                }
            ]
        },
        {
            _id: "5fac3f7dbcdd470fb358a11f",
            level: "5f22c4af80556e32cf0ca8fc",
            name: "africa zone",
            relations: [
                {
                    items: ["5fac3f7cbcdd470fb3589e85"],
                    level: "5f22c4af80556e32cf0ca8fb"
                }
            ]
        }
    ],
    [
        {
            _id: "5fac3f7cbcdd470fb3589e8a",
            level: "5f22c4af80556e32cf0ca8fd",
            name: "india",
            relations: [
                {
                    items: ["5fac3f7cbcdd470fb3589e85"],
                    level: "5f22c4af80556e32cf0ca8fb",
                },
                {
                    items: ["5fac3f7cbcdd470fb3589e87"],
                    level: "5f22c4af80556e32cf0ca8fc",
                },
            ]
        },
        {
            _id: "5fac3f7cbcdd470fb358a0ad",
            level: "5f22c4af80556e32cf0ca8fd",
            name: "nepal",
            relations: [
                {
                    items: ["5fac3f7cbcdd470fb3589e85"],
                    level: "5f22c4af80556e32cf0ca8fb",
                },
                {
                    items: ["5fac3f7cbcdd470fb3589e87"],
                    level: "5f22c4af80556e32cf0ca8fc",
                },
            ]
        },
    ],
    [
        {
            _id: "5fac3f7cbcdd470fb3589e9b",
            level: "5f22c61b80556e32cf0ca908",
            name: "sanofi group (paul hudson)",
            relations: [],
        },
    ],
    [
        {
            _id: "5fac3f7cbcdd470fb3589e9d",
            level: "5f22c61b80556e32cf0ca909",
            name: "general medicines gbu (olivier charmeil)",
            relations: [
                {
                    items: ["5fac3f7cbcdd470fb3589e9b"],
                    level: "5f22c61b80556e32cf0ca908",
                },
            ]
        },
        {
            _id: "5fac3f7cbcdd470fb3589e9e",
            level: "5f22c61b80556e32cf0ca909",
            name: "general medicines gbu (olivier charmeil)2222",
            relations: [
                {
                    items: ["5fac3f7cbcdd470fb3589e9b"],
                    level: "5f22c61b80556e32cf0ca908",
                },
            ]
        },
    ],
];

编辑2: 这是一个更简单的数据版本:

const data = [
    [
        {
            _id: "1",
            level: "l1",
            name: "international",
            relations: []
        }
    ],
    [
        {
            _id: "2",
            level: "l2",
            name: "india mco",
            relations: [
                {
                    items: ["1"],
                    level: "l1",
                }
            ]
        },
        {
            _id: "3",
            level: "l2",
            name: "africa zone",
            relations: [
                {
                    items: ["1"],
                    level: "l1"
                }
            ]
        }
    ],
    [
        {
            _id: "4",
            level: "l3",
            name: "india",
            relations: [
                {
                    items: ["1"],
                    level: "l1",
                },
                {
                    items: ["2"],
                    level: "l2",
                },
            ]
        },
        {
            _id: "5",
            level: "l3",
            name: "nepal",
            relations: [
                {
                    items: ["1"],
                    level: "l1",
                },
                {
                    items: ["2"],
                    level: "l2",
                },
            ]
        },
    ]
];

和期望的结果:

[
  [
    {
      "_id": "1",
      "level": "l1",
      "name": "international",
      "relations": []
    },
    {
      "_id": "2",
      "level": "l2",
      "name": "india mco",
      "relations": [
        {
          "items": [
            "1"
          ],
          "level": "l1"
        }
      ]
    },
    {
      "_id": "4",
      "level": "l3",
      "name": "india",
      "relations": [
        {
          "items": [
            "1"
          ],
          "level": "l1"
        },
        {
          "items": [
            "2"
          ],
          "level": "l2"
        }
      ]
    }
  ],
  [
    {
      "_id": "1",
      "level": "l1",
      "name": "international",
      "relations": []
    },
    {
      "_id": "2",
      "level": "l2",
      "name": "india mco",
      "relations": [
        {
          "items": [
            "1"
          ],
          "level": "l1"
        }
      ]
    },
    {
      "_id": "5",
      "level": "l3",
      "name": "nepal",
      "relations": [
        {
          "items": [
            "1"
          ],
          "level": "l1"
        },
        {
          "items": [
            "2"
          ],
          "level": "l2"
        }
      ]
    }
  ],
]

只有两个有效的组合。
EX:它不应该在以下组合列表中:international - africa zone- nepal,因为nepal第二个关系有项目: ["2"],这india mco不是africa zone

4

2 回答 2

1

您需要 filter b,而不是返回一个空数组,因为空数组不排除被用作结果的实际集合,而只是排除vw对象并包含来自以下数组的对象。

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; }

于 2020-11-09T15:48:17.257 回答
1

用递归而不是许多嵌套数组函数来考虑这一点似乎更清楚。


按命令

提出的最简单的情况是从 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
europe  malaysia 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 和 Level 或按 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.

于 2020-11-09T17:27:36.290 回答