Javascript关联数组:推送一个对象会重写其他数组元素
Javascript associative array: pushing an object rewrites other array elements
我有一个对象来描述我的文档。每个文档都包含层,这些层在数组中的对象中进行了描述
var example = {
id: 'some_id',
layers: [{
id: 'some_layer_id',
width: 100,
height: 200
}]
};
有不同类型的层,每个层都有自己的模板:
var layer_templates = [{
type: 'text',
width: 100,
height: 100,
style: 'common'
}];
我在jQuery事件中创建新层:
jQuery('#button').on('click', function () {
var ldata = layer_templates[0]; // get a template
ldata['id'] = 's-l-' + Math.random().toString(); // create an id
example['layers'].push(ldata); // add new "layer" to document
console.log(example['layers']); // check
});
每次我向example['layers']
数组添加新的ldata
层时,它只保留带有id: 'some_layer_id'
的初始对象,并用最后一个重写所有新创建的对象。
请检查jsFiddle:中的问题
问题是您没有复制模板。您正在所有层中使用和重新使用相同的模板
var ldata = layer_templates[0];
ldata['id'] = 's-l-' + Math.random().toString(); // create an id
实际上,ldata
只是一个引用模板的指针,向其添加id值只会修改您的模板,使其现在看起来像这样:
var layer_templates = [{
type: 'text',
width: 100,
height: 100,
style: 'common',
id: 's-l-0.08636776800267398'
}];
下次你尝试添加另一层时,你会再次做同样的事情,只会再次拉取和更改模板。。。最后,每个层都引用相同的模板,因此是完全相同的数据。
要解决此问题,您需要复制模板,其中一种方法是使用JSON:
var ldata = JSON.parse(JSON.stringify(layer_templates[0]));
此方法创建一个全新的ldata对象,该对象是模板的副本。
相关文章:
- 如何添加浮动和非浮动,其他
- 与其他库的jQuery.noConflict()
- 播放当前视频时如何停止其他视频?JavaScript
- 剑道UI内联编辑:如何在点击其他按钮时隐藏按钮
- 制作一个不带HTML a标记但在动画播放完毕后指向其他页面的超链接
- 除修剪外的其他功能
- 是什么让一个“;Uncaught RangeError:超过了最大调用堆栈大小“;错误(Chrome,在其他浏览器中显示
- Array.length似乎不起作用;console.log则显示其他情况
- 如何消除代码中的未定义和其他问题
- 如何覆盖锚点元素's href目标,并在我点击转到目标javascript时删除其他错误
- Chrome 扩展程序会更新并重写为其他相同的扩展程序
- 如何使用 javascript 或其他代码将 html 代码调出到其他页面,而不是重写长代码
- Javascript关联数组:推送一个对象会重写其他数组元素
- 即时角度服务-我还有什么其他方式可以重写它
- 从其他类继承原型方法,而不重写自己的原型方法
- Javascript'这'在Z组合子和其他递归函数中重写
- 如何从IIS重写模块获得JavaScript(或其他)重写的URL
- 意外的其他令牌:重写
- Javascript小于重写其他小于条件
- 加载具有与其他脚本相同的变量的脚本并重写