Javascript 从名称列表中获取所有可能的对

Javascript 从名称列表中获取所有可能的对,javascript,arrays,Javascript,Arrays,假设我有一个名称数组,例如: let members = ["John", "Marie", "Ivy", "Daniel"]; 每个人都必须向另一个人交付一件独特的物品。以下是1个组合集的示例: [ {"John":"Marie"}, {"Marie":"Ivy"}, {"Ivy":"Daniel"}, {"Daniel":"John"}, ] 接收者只能被命名一次。我想检索所有可能组合的数组。获取这样一个数组的最简单方法是什么 编辑:很多反对票。恐怕是合理

假设我有一个名称数组,例如:

let members = ["John", "Marie", "Ivy", "Daniel"];
每个人都必须向另一个人交付一件独特的物品。以下是1个组合集的示例:

[
    {"John":"Marie"},
    {"Marie":"Ivy"},
    {"Ivy":"Daniel"},
    {"Daniel":"John"},
]
接收者只能被命名一次。我想检索所有可能组合的数组。获取这样一个数组的最简单方法是什么

编辑:很多反对票。恐怕是合理的。这是我的工作,似乎。。。冗长的:

//gets all permutations combination of the same array    
const perm = members => members.length ? members.reduce((r, v, i) => [ ...r, ...perm([ ...members.slice(0, i), ...members.slice(i + 1) ]).map(x => [ v, ...x ])], []) : [[]]


let permutations = perm(members);

permutations.map(set => {
    let valid = true;
    let combination = [];

    set.map((name, i) => {
        let match = {};
        if (name === members[i]) {
            valid = false;
            return
        }
        match[members[i]] = name;
        combination.push(match);
    })

    if (valid) possibilities.push(combination);
})
试试这个

let rslt = []

let members = ["John", "Marie", "Ivy", "Daniel"];

members.forEach((member, i) => { 
    let nextIndex = i + 1;

    // if it's the last member
    // then pass it to the first one
    if (nextIndex === members.length) {
        nextIndex = 0;
    }
    let obj = new Object();
    obj[member] = members[nextIndex];
    rslt.push(obj);
})

console.log(rslt);

谢谢你的贡献。给我一个密码就行了。我在寻找所有可能的组合。