Javascript 将数组设置为另一个数组元素的属性
Javascript set array as attribute of another array element
我想创建一个父数组和另一个子数组,然后为每个父级设置一个子数组。
这是代码:
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 中閱讀的對象。
- 在函数中添加数组元素的数值
- 消隐数组元素是否生成自己的属性
- 用对象属性替换数组元素
- javascript:阻止表示添加的数组's属性作为元素(在Chrome中)
- JavaScript数组元素只不过是数组对象属性
- jQuery 选择在数组数据属性中包含指定项的元素
- 将属性添加到 javascript 数组元素
- 在 JavaScript 中向数组元素添加属性
- 提取具有最大属性值的数组元素
- 在mongoDb中,如果字符串输入与任何数组元素匹配,如何获取整个记录(在这种情况下,数组是记录的属性)
- 删除对象属性类似于删除带有拼接的数组元素
- 如何使用snap.svg循环svg元素并创建每个元素的数组path属性
- AngularJs过滤到单个数组元素并输出一个属性
- 当数组是服务内部对象的属性时,如何在页面上逐个显示数组元素
- 数组元素和对象属性的比较返回false
- 如何更改数组元素的属性
- 将数组元素指定为对象属性,使用'计数器'值
- 为什么可以'我是否在JavaScript中设置数组元素(字符串)的属性
- Javascript -通过键获取特定JSON数组元素中属性的值
- 保存具有多个属性的数组元素