Javascript将数组设置为另一个数组元素的属性

Javascript将数组设置为另一个数组元素的属性,javascript,arrays,Javascript,Arrays,我想创建一个父数组和另一个子数组,然后为每个父数组设置一个子数组 代码如下: var parent = []; var child = []; // Set kids for (a = 0; a <= 5; a++) { child[a] = []; child[a].name = "kid " + a; } // Set parents and their kids for (b = 0; b < 2; b++) { parent[b] = [];

我想创建一个父数组和另一个子数组,然后为每个父数组设置一个子数组

代码如下:

var parent = [];
var child = [];

// Set kids
for (a = 0; a <= 5; a++) {
    child[a] = [];
    child[a].name = "kid " + a;
}

// Set parents and their kids
for (b = 0; b < 2; b++) {
    parent[b] = [];
    parent[b].name = "parent " + b;
    parent[b].kids = child;
}

// One parent has kid name anna
parent[0].kids[2].name = "anna";

// Output
for (a = 0; a < 2; a++) {
    console.log("");

    for (b = 0; b < 5; b++) {
        console.log(b + " -> " + parent[a].name + " " + parent[a].kids[b].name);
    }
}
var parent=[];
var child=[];
//安排孩子
对于(a=0;父母0;孩子0

1->父母0孩子1

2->父级0

3->父母0孩子3

4->父母0孩子4


二亲

0->父1子0

1->父母1孩子1

2->家长1

3->父母1子女3

4->父母1子女4



为什么父母双方都有相同的孩子?只有第一个应该有孩子的名字anna,更重要的是,我如何使它正常工作?

因为您在新创建的对象中传递对数组的引用

var a = [1,2,3,4];
var b = a;
b[0] = 2;
a[0] === 2; // true
要发送新阵列(克隆)。您可以执行以下操作:

for (b = 0; b < 2; b++) {
    parent[b] = [];
    parent[b].name = "parent " + b;
    parent[b].kids = child.slice(); // Slice creates a new array from the old
}

有关使用您可以阅读的对象的详细信息。

如前所述,您的问题是将相同的子对象数组分配给每个父对象

如果数组
child
包含基元值,那么使用任何复制数组的方法,然后设置
child
属性实际上都会有所帮助,因为浅拷贝就足够了。但是,这里提出的问题稍微复杂一点,因为元素不是基元,所以应该使用深度拷贝的方法用过

更具体地说,不仅需要复制整个数组,还需要分别复制每个项目

您可以尝试在每次分配给父级时使用类似于“复制子级”的方法。这不是最漂亮、最快的方法,但应该足够好,可以开始使用

function clone(obj) {
    if(obj == null || typeof(obj) != 'object')
        return obj;

    var temp = obj.constructor(); // changed

    for(var key in obj) {
        if(obj.hasOwnProperty(key)) {
            temp[key] = clone(obj[key]);
        }
    }
    return temp;
}

function copy_kids(kids) {
    var new_kids = [];
    for (var kid_id = 0; kid_id < kids.length; ++kid_id) {
        new_kids[kid_id] = clone(kids[kid_id]);
    }
    return new_kids;
}

完全准确地说,这不是真正的深度复制,只是比复制数组本身更深一点。您可以阅读更多关于深度复制与浅层复制的信息。

因为您正在将所有.kids属性设置为相同的
child
array。对象和数组在JS中是通过引用而不是值传递的。您可能还想使用c为每个新的partent/child创建一个对象而不是数组,即
parent[b]={};
而不是
parent[b]=[];
,因为
parent[b]。kids=child;
。因此所有
类型的
都是对
child
对象的相同对象引用。请注意,因为OP使用数组作为对象(设置
.name
属性),
切片在这种情况下没有帮助。
function clone(obj) {
    if(obj == null || typeof(obj) != 'object')
        return obj;

    var temp = obj.constructor(); // changed

    for(var key in obj) {
        if(obj.hasOwnProperty(key)) {
            temp[key] = clone(obj[key]);
        }
    }
    return temp;
}

function copy_kids(kids) {
    var new_kids = [];
    for (var kid_id = 0; kid_id < kids.length; ++kid_id) {
        new_kids[kid_id] = clone(kids[kid_id]);
    }
    return new_kids;
}
// Older
parent[b].kids = child;

// Newer
parent[b].kids = copy_kids(child);