Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.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_Object_Reference - Fatal编程技术网

Javascript 将两个唯一的对象推送到一个空数组会导致一个包含两个等效对象的数组

Javascript 将两个唯一的对象推送到一个空数组会导致一个包含两个等效对象的数组,javascript,arrays,object,reference,Javascript,Arrays,Object,Reference,我有以下资料: var params = {status: [69,71]}; var getTasks = function(params) { if (params.status.constructor === Array) { var statuses = params.status; var newParams = []; for (var i = 0; i < statuses.length; i++) {

我有以下资料:

var params = {status: [69,71]};

var getTasks = function(params) {
    if (params.status.constructor === Array) {
        var statuses = params.status;
        var newParams = [];

        for (var i = 0; i < statuses.length; i++) {
            params.status = statuses[i];
            newParams.push(params);
        }
        console.log(newParams);

    }
    // else {
    //     ...
    // }
};
for (var i = 0; i < statuses.length; i++) {
    params.status = statuses[i];
    newParams.push(params);
}
var-params={status:[69,71]};
var getTasks=函数(参数){
if(params.status.constructor==数组){
变量状态=参数状态;
var newParams=[];
对于(变量i=0;i
调用
getTasks(params)
newParams
记录为:

[{status:71},{status:71}]

我希望这会注销

[{status:69},{status:71}]

我在这里遗漏了什么?

您两次推送同一对象,对象的最新更改可见

var obj;
for (var i = 0; i < statuses.length; i++) {
    // construct obj as desired
    obj = {}; // notice this new object is created inside the loop
    obj.status = statuses[i];
    // push to your array
    newParams.push(obj);
}
var-obj;
对于(变量i=0;i
newParams.push(参数)
正在将
params
引用的对象推送到数组中。如果数组中充满了对同一对象的引用,那么对该对象的任何修改都将出现在每个数组元素中,因为它们都是同一个对象。每次创建一个新对象,而不是重复使用相同的对象:

for (var i = 0; i < statuses.length; i++) {
    newParams.push( { status: statuses[i] } );
}
for(变量i=0;i
参数
是单个对象。在
for
循环中,执行以下操作:

var params = {status: [69,71]};

var getTasks = function(params) {
    if (params.status.constructor === Array) {
        var statuses = params.status;
        var newParams = [];

        for (var i = 0; i < statuses.length; i++) {
            params.status = statuses[i];
            newParams.push(params);
        }
        console.log(newParams);

    }
    // else {
    //     ...
    // }
};
for (var i = 0; i < statuses.length; i++) {
    params.status = statuses[i];
    newParams.push(params);
}

@PaulPro和@PaulS给出了正确的答案,但总有机会学习新东西。在这种情况下,我建议您看看哪些可以大大简化您的代码:

function statutify(value) {
    return { status: value };
}

var getTasks = function(params) {
    if (params.status.constructor === Array) {
        var newParams = params.status.map(statutify);
        console.log(newParams);
    }
    // ...
};

或者,了解@voithos建议的其他库也无妨。

在循环中,您正在使用
params.status=status[i]更改全局
params
对象
然后继续
推送
ing相同的
参数
对象。对象被视为引用,这意味着当您对对象进行更改时,它们将传播到引用对象的任何地方。这就是为什么它们得到相同的值,它们是相同的对象。不过,基于代码,您实际上希望实现什么还不清楚。