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

Javascript set array as attribute of another array element

本文关键字:数组元素 属性 另一个 数组 设置 Javascript      更新时间:2023-09-26

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

这是代码:

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);
    }
}

第一父母

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


为什么父母双方都有相同的孩子,只有第一个应该有孩子的名字安娜,更重要的是我怎样才能让它正常工作?

如前所述,您的问题是为每个父级分配相同的子项数组。

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

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

每次将其分配给父级时,您都可以尝试使用类似此复制子项的内容。这不是目前最漂亮的最快方法,但应该足够好开始。

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);

准确地说,这不是真正的深度复制,而只是比复制数组本身更深一点。您可以在此处阅读有关深拷贝与浅拷贝的更多信息。

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

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
}

编辑 1

正如@dfsq在提供的原始问题和代码中所述,您实际上是在使用对象而不是数组。在不深入讨论克隆对象的最佳方法的情况下,让我们假设您在代码中使用 jQuery,在这种情况下,您可以安全地执行以下操作:

parent[b].kids = $.extend({}, child);

更多關於使用可在 Mozilla Developer Network 中閱讀的對象。