javascript变量不一致地接收函数的输出

javascript变量不一致地接收函数的输出,javascript,Javascript,需要一点帮助,我有一个等于函数的变量,有时它无法解析,我无法确定原因。代码应该写入一对名称,array.slice应该慢慢地将数组配对,同时我也会缩小随机数以适应数组的大小。我希望有人会告诉我,我遗漏了一些明显的东西。 编辑:上述代码中的d和e为50/50,或者等于数组中的名称,或者等于零。这是我无法确定的 var familymembers=[“弗兰克”、“托德”、“比尔”、“珍妮丝”、“马可”、“蒂莉”、“蒙克”、“弗朗西斯科”、“詹姆斯”、“比尔”、“加里”]; var selected

需要一点帮助,我有一个等于函数的变量,有时它无法解析,我无法确定原因。代码应该写入一对名称,array.slice应该慢慢地将数组配对,同时我也会缩小随机数以适应数组的大小。我希望有人会告诉我,我遗漏了一些明显的东西。 编辑:上述代码中的d和e为50/50,或者等于数组中的名称,或者等于零。这是我无法确定的

var familymembers=[“弗兰克”、“托德”、“比尔”、“珍妮丝”、“马可”、“蒂莉”、“蒙克”、“弗朗西斯科”、“詹姆斯”、“比尔”、“加里”];
var selectedfamilymembers=familymbers;
var itemlength=(familymembers.length);
var m=家庭成员[1];
var n=选定的家庭成员[1];
控制台日志(m);
控制台日志(n);
函数选择器(array1,array2){
让d;
让f;
对于(变量i=array1.length-1;i>=0;i--){
console.log(itemlength);
a=随机化器(itemlength);
b=随机化器(itemlength);
//控制台日志(a);
//控制台日志(b);
d=(移除器(a,家庭成员));
e=(删除程序(b,选定的家庭成员));
console.log(“d=”+d);
console.log(“e=“+e”);
//阵列1.拼接(a,1);
//控制台日志(array1);
//阵列2.拼接(b,1);
//控制台日志(array2);
itemlength=itemlength-1;
控制台日志(d+“->”+e);
}
}  
函数移除器(selectedspace,array){
console.log(“所选号码为”+selectedspace);
返回数组.拼接(selectedspace,1);
}
函数随机化器(rnumber){
返回值(Math.floor(Math.random()*rnumber));
}

christmasselector(家庭成员、选定家庭成员)我认为您正在使用两个不同的引用操作同一个数组,您需要克隆familymembers,然后再将其分配给selectedfamilymembers,这就是我使用var selectedfamilymembers=[…familymembers]所做的

var familymembers=[“弗兰克”、“托德”、“比尔”、“珍妮丝”、“马可”、“蒂莉”、“蒙克”、“弗朗西斯科”、“詹姆斯”、“比尔”、“加里”];
var selectedfamilymembers=[…familymembers];
var itemlength=(familymembers.length);
var m=家庭成员[1];
var n=选定的家庭成员[1];
控制台日志(m);
控制台日志(n);
函数选择器(array1,array2){
让d;
让f;
对于(变量i=array1.length-1;i>=0;i--){
console.log(itemlength);
a=随机化器(itemlength);
b=随机化器(itemlength);
//控制台日志(a);
//控制台日志(b);
d=(移除器(a,家庭成员));
e=(删除程序(b,选定的家庭成员));
console.log(“d=”+d);
console.log(“e=“+e”);
//阵列1.拼接(a,1);
//控制台日志(array1);
//阵列2.拼接(b,1);
//控制台日志(array2);
itemlength=itemlength-1;
控制台日志(d+“->”+e);
}
}
函数移除器(selectedspace,array){
console.log(“所选号码为”+selectedspace);
返回数组.拼接(selectedspace,1);
}
函数随机化器(rnumber){
返回值(Math.floor(Math.random()*rnumber));
}

christmasselector(家庭成员、选定家庭成员)数组是JavaScript中的引用类型。当您拼接选定的家族成员时,也会拼接家族成员

发件人:

这意味着,如果将数组赋给变量或将数组传递给函数,则复制或传递的是对原始数组的引用,而不是数组的值

像这样试试

var familymembers = ["Frank", "Todd", "Bill", "janice", "marco", "tilly", "monk", "francisco", "james", "bill", "gary"];
var selectedfamilymembers = familymembers.concat();
// var selectedfamilymembers = [...familymembers]; this also works

// var selectedfamilymembers = familymembers.slice();   this also works
var itemlength = familymembers.length;

function christmasselector (array1, array2){
    let d;
    let f;
    for (var i = array1.length - 1; i >= 0; i--){
        console.log(itemlength);
        a = randomizer(itemlength);
        b = randomizer(itemlength);
        
        d = (remover(a, familymembers));
        f = (remover(b, selectedfamilymembers));
        
        itemlength = itemlength - 1;

        console.log(d + " -> " + f);

    }
}  


function remover(selectedspace, array){
  console.log("The selected number is " + selectedspace);
  return array.splice(selectedspace, 1);
}

function randomizer(rnumber){
  return (Math.floor(Math.random() *rnumber));
}



christmasselector (familymembers, selectedfamilymembers);

您可以使用调试器,在开始处停止,然后逐步完成代码。