按值将对象数组推送到另一个数组

时间:2020-05-16 17:49:21

标签: javascript arrays multidimensional-array

我的以下程序得到了意外的结果。 inputsoutputs数组都获得相同的值。从this以某种方式我知道这是传递引用的问题。我的问题是如何通过以下方法实现相同目标。感谢您的时间。

期望输入数组为[[{id: 1, name: 'foo'}, {id: 2, name: 'bar'}], [{id: 1, name: 'foo'}]]

var inputs = [];
var outputs = [];
var exampleArr = [{id: 1, name: 'foo'}, {id: 2, name: 'bar'}];

function analyze(listArr) {
    inputs.push(...listArr);

    outputs = [...outputs, ...listArr];

    outputs.forEach((item) => {
        item.name = 'hello';
    });

    console.log('inputs', inputs);
    console.log('ouputs', outputs);
    listArr.pop();
    if(listArr.length) analyze(listArr);
}

analyze(exampleArr);

1 个答案:

答案 0 :(得分:0)

在附加到输出之前,先克隆listArr中的所有对象(仅一个嵌套级别)。

var inputs = [];
var outputs = [];
var exampleArr = [{id: 1, name: 'foo'}, {id: 2, name: 'bar'}];

function analyze(listArr) {
    inputs.push(...listArr);

    // clone objects in array, one level
    outputs = [...outputs, ...listArr.map(x=>typeof x==='object'? {...x}:x)];

    outputs.forEach((item) => {
        item.name = 'hello';
    });

    console.log('inputs', inputs);
    console.log('ouputs', outputs);
    listArr.pop();
    if(listArr.length) analyze(listArr);
}

analyze(exampleArr);