Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组组合作为数组_Javascript_Arrays - Fatal编程技术网

Javascript 数组组合作为数组

Javascript 数组组合作为数组,javascript,arrays,Javascript,Arrays,我有以下数组: const data = [ [ { "_id": "5f6a02639a62a612a172d9d0", "level": "5f22c4af80556e32cf0ca8fb", "name": "asia", "relations": [] }, {

我有以下数组:

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"
        }
      ]
    }
  ],
]
只有两个有效组合。

例:以下组合不应出现在列表中:国际-
非洲区
-尼泊尔
,因为尼泊尔第二关系有项:[“2”],即
印度mco
不是
非洲区
您需要过滤
b
,而不是返回空数组,因为空数组不排除作为结果使用的实际对象集,而是仅排除
v
w
对象,并包括以下数组中的对象

const
数据=,级别:“5f22c4af80556e32cf0ca8fb”},{项目:[“5F6A02639A612A172DA4A”],级别:“5f22c4af80556e32cf0ca8fc”},{id:“5F6A02649A612A172DBA0”,级别:“5f22c4af80556e32cf0ca8fd”,名称:“意大利”,关系:[项目:[“5F6A02649A612A172DB2F”],级别:“5F6A02646A612A172FB”},项目:[级别:]“5f22c4af80556e32cf0ca8fc”},级别:“5f22c4af80556e32cf0ca8fd”,名称:“马来西亚”,关系:[项目:[“5F6A02639A612A172D9D0”],级别:“5f22c4af80556e32cf0ca8fb”},级别:[“5F6A02649A612A612A172DD23”],级别:“5F22C4AF556E32CF08CF807D0”},级别:“5F6A02649A612A172DD23”5f22c4d180556e32cf0ca8ff”,名称:“数字”,关系:[]}],
组合=数据。减少((a,b)=>{
返回a.reduce((r,v)=>{
返回r.concat(b
.filter({relationship})=>
!长度||
一些({items,level})=>level==v.level&&items[0]==v.\u id)
)
.map(w=>[].concat(v,w))
);
}, []);
});
console.log(组合);

.as console wrapper{max height:100%!important;top:0;}
从递归而不是许多嵌套数组函数的角度来考虑这一点似乎更清楚


按命令 最简单的情况是给出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
您已经演示了如何使用数组函数执行此操作。使用递归,可以实现如下相同的操作:

函数getCombinationsByOrder(){ 让重现=(iarray)=>{ var a=[]; var-temp=[]; if(iarray==data.length-1){ 返回(数据[iarray]); }否则{ 温度=重现(iarray+1);
对于(var i=0;iI不清楚为什么例如
digital
会突然在所需结果中出现3次,但在原始数据中仅出现一次。请重新表述您的问题,说明当前函数不起作用的原因以及确切的标准是什么。非常感谢您的努力。它似乎工作正常,但不包括d数字,应该包括在所有的组合中,因为它没有任何关系。也许我的问题不清楚。我不清楚。过滤时应该包括所有没有关系的条目,并且排除那些有关系但没有特定关系的条目,还是数字只是个例外?是的,所有没有关系的条目应包括。请参阅我的编辑,我在编辑中给出的示例应返回一个包含4个组合的数组。您的答案将返回一个包含5个组合的数组(最后一个组合不完整,但它存在)。您对这些数据使用了什么筛选条件?预期结果是什么?您好@Nina,我发现您的答案不起作用,而是给了我一个空数组。请查看我的编辑。请添加所需的结果。顺便说一句。如果您将不可读取的
id
/
级别
值替换为更多的reada,这将更加容易ble,比如颜色或项目,或者至少是一些小的数字。bastract from使得如果没有一些工具和时间来可视化问题,几乎不可能理解您想要得到什么。实际使用的algo会过滤掉不需要的项目。也许这就是问题所在,因为如果某个项目是不需要的,那么整个子产品都会被过滤掉可能一个图表有助于简化节点描述。请参阅我的第二次编辑。