天道酬勤,学无止境

Javascript 克隆节点不会将所有值从克隆的对象复制到新对象(Javascript clone node is not copying all values from cloned to new object)

问题
<div class="container">
  <select class="btn" name="item">
    <option>Alpha</option>
    <option>Beta</option>
    <option>Gamma</option>
    <option>Theta</option>
  </select>
  <input type="text" class="desc" name="desc">
</div>

在此示例中,“选择”下拉列表中默认选择的元素是“Alpha”。 我想用值克隆完整的节点。 如果我在下拉列表中选择不同的值并在输入框中输入一些文本,然后克隆节点,则只会克隆文本框值。 新对象中“选择”下拉列表的值保持默认值(Alpha)。

为什么“选择”与“输入”的克隆行为不同?

var parent = document.querySelector(".container");
var button = parent.querySelector(".btn");
var textbox = parent.querySelector(".desc");

  > textbox.value
  < "some random text"
  > button.value
  < "Gamma"

var cloned = parent.cloneNode(true);
var childButton = cloned.querySelector(".btn");
var childTextbox = cloned.querySelector(".desc");

  > childTextbox.value
  < "some random text"
  > childButton.value
  < "Alpha"
回答1

当您更改选择时,选择的状态存储在浏览器中,克隆节点永远不会包含浏览器更改和/或存储的对象/元素的状态。

但是对于input ,它被存储为属性value并被克隆。

要克隆具有选定值的节点,

您应该检测更改事件并向其添加selected属性。

即为select for change事件添加一个事件监听器。

然后在回调函数,设置属性selected通过使用该对象

selectElement.options[selectElement.selectedIndex].setAttribute("selected","");

运行下面的代码片段。

从列表中选择任何值并在文本框中键入内容,然后单击克隆按钮。

 var parent = document.querySelector(".container"); var button = parent.querySelector(".btn"); var textbox = parent.querySelector(".desc"); console.log(button.value); console.log(textbox.value); function update(val){ val.options[val.selectedIndex].setAttribute("selected",""); } function clone(){ var cloned = parent.cloneNode(true); document.querySelector(".container-2").appendChild(cloned); var childButton = cloned.querySelector(".btn"); var childTextbox = cloned.querySelector(".desc"); console.log(button.value); console.log(textbox.value); }
 <div class="container"> <select class="btn" name="item" onchange="update(this);"> <option>Alpha</option> <option>Beta</option> <option>Gamma</option> <option>Theta</option> </select> <input type="text" class="desc" name="desc"> </div> <button onclick="clone();">Clone</button> <div class="container-2"></div>
回答2

我使用 getElementsByClass() 方法来获取有趣的元素。然后通过 for 循环我添加一个 onchange 事件来克隆容器。注意在函数的末尾,我将父 select 元素的值分配给克隆的 select elm。

 var parent = document.getElementsByClassName("container"); var button = document.getElementsByClassName("btn"); for(var i=0;i<button.length;i++){ button[i].onchange=function(){ var cloned = parent[0].cloneNode(true); console.log(cloned); document.body.appendChild(cloned); cloned.childNodes[1].value=this.value; }; }
 <div class="container"> <select class="btn" name="item"> <option>Alpha</option> <option>Beta</option> <option>Gamma</option> <option>Theta</option> </select> <input type="text" class="desc" name="desc"> </div>
回答3

克隆<select>复制value=上属性<option>秒。

发生这种情况是因为更改属性会更改表单控件的状态,但不会更改元素的 HTML selected 属性的值。
您可以在 W3 规范中阅读有关它的更多信息。

在您的示例中,如果您检查parent节点的值,您将看到只有该元素具有正确的选定值,而没有其克隆。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何克隆JavaScript ES6类实例(How to clone a javascript ES6 class instance)
    问题 如何使用ES6克隆Javascript类实例。 我对基于jquery或$ extend的解决方案不感兴趣。 我见过很多关于对象克隆的讨论,这些讨论表明问题很复杂,但是使用ES6时,它本身就可以提供一个非常简单的解决方案-我将其放在下面,看看人们是否认为它令人满意。 编辑:有人建议我的问题是重复的; 我看到了这个答案,但它已有7年历史,并且使用ES6之前的js涉及非常复杂的答案。 我建议我的问题(允许使用ES6)有一个非常简单的解决方案。 回答1 这很复杂; 我尝试了很多! 最后,这种单行代码适用于我的自定义ES6类实例: let clone = Object.assign(Object.create(Object.getPrototypeOf(orig)), orig) 它避免设置原型,因为他们说这会大大降低代码的速度。 它支持符号,但不适用于getter / setter方法,并且不适用于不可枚举的属性(请参见Object.assign()文档)。 另外,可悲的是,克隆基本内部类(例如Array,Date,RegExp,Map等)似乎经常需要一些单独的处理。 结论:这是一团糟。 希望有一天将提供本机且干净的克隆功能。 回答2 const clone = Object.assign( {}, instanceOfBlah ); Object.setPrototypeOf(
  • 深层副本和浅层副本有什么区别?(What is the difference between a deep copy and a shallow copy?)
    问题 这个问题的答案是社区的努力。 编辑现有答案以改善此职位。 它目前不接受新的答案或互动。 深层副本和浅层副本有什么区别? 回答1 浅拷贝应尽可能少地重复。 集合的浅表副本是集合结构的副本,而不是元素。 对于浅表副本,现在两个集合共享各个元素。 深层副本会复制所有内容。 集合的深层副本是两个集合,原始集合中的所有元素都重复了。 回答2 广度vs深度; 从引用树的角度出发,以对象为根节点。 浅的: 变量A和B指代不同的内存区域,当将B分配给A时,两个变量指代相同的内存区域。 由于它们共享内容,因此对其中一个的内容进行的后续修改会立即反映在另一个的内容中。 深的: 变量A和B指向不同的内存区域,当B分配给A时,将A指向的存储区域中的值复制到B指向的存储区域中。 以后对A或B的内容进行的修改对于A或B保持唯一; 内容不共享。 回答3 简而言之,它取决于什么指向什么。 在浅表副本中,对象B指向对象A在内存中的位置。 在深层复制中,对象A的存储位置中的所有内容都将复制到对象B的存储位置。 这篇Wiki文章有一个很棒的图表。 http://en.wikipedia.org/wiki/Object_copy 回答4 尝试考虑以下图片 例如Object.MemberwiseClone创建一个浅表复制链接 并使用ICloneable接口,您可以获得此处所述的深层副本 回答5
  • 下划线clone()和简单的'='有什么区别?(What's the difference between underscore clone() and simple '='?)
    问题 当您需要在javascript中复制对象时,这是关于最佳做法的信息。 例如: 我有一个对象{ name: 'Dodo', method: function () { console.log(this.name) }} ; 我需要创建一个副本: var obj = { name: 'Dodo', method: function () { console.log(this.name) } }; // what is better? var copyUnderscore = _(obj).clone(); var copySimple = obj; 有什么更好的方法? 谢谢! 回答1 _.clone与赋值完全不同。 _.clone创建一个新对象,并将每个值从原始对象复制到新对象。 赋值只是将变量指向已存在的对象。 假设你有一只小狗。 我们叫他雷克斯(Rex)。 如果您要与某人讨论Rex,您将其称为Rex,或者也许是“狗”。 这两个都是有关动物的参考。 作业类似于为宠物使用不同的短语: rex = { type: 'Dog', age: '12 Weeks', name: "Rex", fixed: false, fix: function() { this.fixed = true; console.log(this.name + " Fixed."); } }; theDog
  • 没有参考javascript的克隆对象(Clone Object without reference javascript [duplicate])
    问题 这个问题已经在这里有了答案: 在JavaScript中深度克隆对象的最有效方法是什么? (67个答案) 10个月前关闭。 我有一个拥有大量数据的大物体。 我想将其克隆到其他变量中。 当我设置实例B的某些参数时,在原始对象中具有相同的结果: var obj = {a: 25, b: 50, c: 75}; var A = obj; var B = obj; A.a = 30; B.a = 40; alert(obj.a + " " + A.a + " " + B.a); // 40 40 40 我的输出应该是25 3040。有什么想法吗? 编辑 谢谢大家。 我更改了dystroy的代码,这是我的结果: Object.prototype.clone = Array.prototype.clone = function() { if (Object.prototype.toString.call(this) === '[object Array]') { var clone = []; for (var i=0; i<this.length; i++) clone[i] = this[i].clone(); return clone; } else if (typeof(this)=="object") { var clone = {}; for (var prop in this
  • 如何不通过引用将JavaScript对象复制到新变量? [复制](How to copy JavaScript object to new variable NOT by reference? [duplicate])
    问题 这个问题已经在这里有了答案: 在JavaScript中深度克隆对象的最有效方法是什么? (67个答案) 7年前关闭。 我在这里写了一个快速的jsfiddle,在其中我将一个小的JSON对象传递给一个新变量,并修改了原始变量(而不是新变量)中的数据,但是新变量的数据也得到了更新。 这必须意味着JSON对象是通过引用传递的,对不对? 这是我的快速代码: var json_original = {one:'one', two:'two'} var json_new = json_original; console.log(json_original); //one, two console.log(json_new); //one, two json_original.one = 'two'; json_original.two = 'one'; console.log(json_original); //two, one console.log(json_new); //two, one 有没有办法对JSON对象进行深层复制,以便修改原始变量不会修改新变量? 回答1 我发现如果您不使用jQuery而仅对克隆简单对象感兴趣(请参见注释),则可以使用以下方法。 JSON.parse(JSON.stringify(json_original)); 文献资料 JSON.parse()
  • 为什么克隆(在.NET中)如此困难?(Why is cloning (in .NET) so difficult?)
    问题 过去,我需要克隆对象,只是发现它们没有实现Clone()方法,从而迫使我手动进行操作(创建一个新实例,并将所有属性从原始实例复制到新实例) 为什么克隆不像复制对象分配到的内存块那样容易,从而使object类具有Clone方法,而.NET中的所有类都可以继承它呢? 回答1 因为那将不会执行深层克隆,通常这是克隆真正需要的。 想象一下,您有一个对数组或列表的引用...简单地复制对象所占用的内存将只是克隆该引用。 通过克隆以及原始对象都可以看到对阵列的任何更改-因此这两个对象仍然保持连接,这违反了正常的克隆点。 如果要完全实现该功能,这很简单-这就是Object.MemberwiseClone()的目的。 在大多数情况下,即使克隆对象甚至有意义(克隆的NetworkStream是什么意思?),也可以克隆每个属性……除非它已经引用了不可变的值,等等。换句话说,这就是一个自然而然的难题,这就是为什么大多数类型不支持克隆的原因。 如果您坚持使用不可变类型,那么问题就不大了……诚然,这会使其他事情变得更加困难,但在许多情况下它可能非常强大。 回答2 其他人已经对MemberwiseClone进行了解释,但是没有人解释为什么要对其进行保护。 我会尽力给出理由。 这里的问题是MemberwiseClone只是盲目地复制状态。 在许多情况下,这是不希望的。 例如,对象可能具有一个私有字段
  • 如何在Javascript中克隆对象数组?(How do you clone an Array of Objects in Javascript?)
    问题 ...每个对象还引用了同一数组中的其他对象吗? 当我第一次想到这个问题时 var clonedNodesArray = nodesArray.clone() 将存在并搜索有关如何在javascript中克隆对象的信息。 我确实在StackOverflow上发现了一个问题(由同样的@JohnResig回答),他指出,使用jQuery,您可以做到 var clonedNodesArray = jQuery.extend({}, nodesArray); 克隆对象。 我尝试了一下,但这仅复制了数组中对象的引用。 所以如果我 nodesArray[0].value = "red" clonedNodesArray[0].value = "green" nodeArray [0]和clonedNodesArray [0]的值都将变为“绿色”。 然后我尝试 var clonedNodesArray = jQuery.extend(true, {}, nodesArray); 它深深复制了一个对象,但是我分别从Firebug和Opera Dragonfly得到了“太多的递归”和“控制堆栈溢出”消息。 你会怎么做? 这是什至不应该做的事情吗? 有没有一种可重用的方式来做到这一点在Javascript中? 回答1 浅表副本的问题是未克隆所有对象。 虽然每个对象的引用在每个数组中都是唯一的
  • 如何在Java中复制对象?(How do I copy an object in Java?)
    问题 考虑下面的代码: DummyBean dum = new DummyBean(); dum.setDummy("foo"); System.out.println(dum.getDummy()); // prints 'foo' DummyBean dumtwo = dum; System.out.println(dumtwo.getDummy()); // prints 'foo' dum.setDummy("bar"); System.out.println(dumtwo.getDummy()); // prints 'bar' but it should print 'foo' 因此,我想将dum复制到dumtwo并在不影响dumtwo情况下更改dum 。 但是上面的代码没有做到这一点。 当我改变的东西dum ,同一个变化在发生dumtwo也。 我猜想,当我说dumtwo = dum ,Java只复制引用。 那么,有什么方法可以创建新的dum副本并将其分配给dumtwo吗? 回答1 创建一个副本构造函数: class DummyBean { private String dummy; public DummyBean(DummyBean another) { this.dummy = another.dummy; // you can access } }
  • 为什么.NET 框架不提供深度复制对象的方法? [关闭](Why doesn't the .NET framework provide a method to deep copy objects? [closed])
    问题 就目前而言,这个问题不适合我们的问答形式。 我们希望答案得到事实、参考或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。 如果您觉得此问题可以改进并可能重新打开,请访问帮助中心以获取指导。 8 年前关闭。 前几天我正在使用自定义方法来深度克隆对象,我知道您可以通过不同的方式(反射、二进制序列化等)进行深度克隆,所以我只是想知道: Microsoft 不在框架中包含深度复制方法的原因是什么? 回答1 这个问题比你似乎意识到的要困难得多,至少在一般情况下是这样。 对于初学者来说,副本不只是深或浅,而是一个范围。 让我们想象一下,我们有一个字符串数组列表,我们想要复制它。 我们从最浅的层次开始,我们只是将整个事物的引用复制到另一个变量。 从任一变量引用的列表的任何更改都会被另一个看到。 所以现在我们去创建一个全新的列表来提供给第二个变量。 对于第一个列表中的每个项目,我们将其添加到第二个列表中。 现在我们可以修改从任一变量引用的列表,而不会被另一个变量看到。 但是如果我们获取列表的第一项并更改第一个数组中的字符串,这两个列表都会看到它! 现在我们正在创建一个新列表,对于第一个列表中的每个数组,我们创建一个新数组,将底层数组中的每个字符串添加到新数组中,并将这些新数组中的每一个添加到新名单。 现在我们可以改变任一列表中的任何数组而不会看到变化。 但是等等
  • 如何在 Angular UI 树中克隆节点?(How to clone node in Angular UI tree?)
    问题 如何在所有子节点的 Angular UI 树中克隆节点? 现在我使用事件点击: ng-click="newSubItem(this)"其中newSubItem是函数: $scope.newSubItem = function (scope) { var nodeData = scope.$modelValue; var arrr_nodes = []; angular.forEach(nodeData.nodes, function (value) { arrr_nodes.push(arrr_nodes); }); var total_nodes = nodeData.nodes.length; var prefix_increment = total_nodes + 1; nodeData.nodes.push({ id: nodeData.id + prefix_increment, prefix: nodeData.prefix + "_" + prefix_increment, title: nodeData.title + '.' + (nodeData.nodes.length + 1), value: nodeData.value, type: nodeData.type, nodes: arrr_nodes }); }
  • 深层复制,浅层复制,克隆(Deep copy, shallow copy, clone)
    问题 我需要澄清Java中的深层复制,浅层复制和克隆之间的区别 回答1 不幸的是,“浅拷贝”,“深拷贝”和“克隆”都是定义不明确的术语。 在Java上下文中,我们首先需要在“复制值”和“复制对象”之间进行区分。 int a = 1; int b = a; // copying a value int[] s = new int[]{42}; int[] t = s; // copying a value (the object reference for the array above) StringBuffer sb = new StringBuffer("Hi mom"); // copying an object. StringBuffer sb2 = new StringBuffer(sb); 简而言之,对类型为引用类型的变量的引用分配是“复制值”,其中值是对象引用。 要复制对象,某些东西需要显式地或在幕后使用new 。 现在用于对象的“浅”复制与“深”复制。 浅复制通常意味着仅复制对象的一个​​级别,而深复制通常意味着复制多个级别的对象。 问题在于确定水平是什么意思。 考虑一下: public class Example { public int foo; public int[] bar; public Example() { }; public Example(int
  • clone():ArrayList.clone()我以为是浅表复制(clone(): ArrayList.clone() I thought does a shallow copy)
    问题 ArrayList<Integer> a=new ArrayList<Integer>(); a.add(5); ArrayList<Integer> b=(ArrayList<Integer>)a.clone(); a.add(6); System.out.println(b.toString()); 在上面的代码中,我认为clone()会进行浅表复制。 因此, b和a应该指向相同的存储位置。 但是,当我执行b.toString() ,答案仅为5 。 如果clone()进行浅表复制,为什么也没有显示6 ? 回答1 浅拷贝并不意味着它们指向相同的存储位置。 那只是一个任务: List b = a; 。 克隆会创建一个拥有相同元素的新实例。 这意味着您有2个不同的列表,但是它们的内容是相同的。 如果您在第一个列表中更改了对象的状态,则它将在第二个列表中更改。 (由于您使用的是不可变类型- Integer -您无法观察到此情况) 但是,您应该考虑不使用clone() 。 它适用于集合,但通常被认为是损坏的。 使用复制构造函数- new ArrayList(originalList) 回答2 如果是像你想,那么clone的方法是完全没用的,因为在这种情况下,下面的线是等价的: ArrayList<Integer> b = (ArrayList<Integer>)a.clone()
  • MemberwiseClone()的方法是做什么的?(What is the method MemberwiseClone() doing?)
    问题 我对下面的代码感到困惑, Developer devCopy = (Developer)dev.Clone(); Developer类的克隆方法只是创建一个Employee克隆,然后开发人员如何获得另一个开发人员克隆。 public abstract class Employee { public abstract Employee Clone(); public string Name { get; set; } public string Role { get; set; } } public class Typist : Employee { public int WordsPerMinute { get; set; } public override Employee Clone() { return (Employee)MemberwiseClone(); } public override string ToString() { return string.Format("{0} - {1} - {2}wpm", Name, Role, WordsPerMinute); } } public class Developer : Employee { public string PreferredLanguage { get; set; } public
  • 克隆整个 JavaScript ScriptEngine(Clone Entire JavaScript ScriptEngine)
    问题 我需要以某种方式深度克隆我的 ScriptEngine 对象的整个绑定集。 我试过的 到目前为止,我已经尝试使用 Cloner 库来克隆整个 Bindings 结构。 如果它有效,那就太好了,因为它可以确保精确的副本,包括私有变量。 但这会导致 jvm 堆损坏(jvm 只是崩溃,退出代码为 -1073740940)。 有时它不会崩溃,但会发生奇怪的事情,比如System.out.println()停止正常工作...... 我还研究了在 ScriptEngine 中使用 js 代码克隆对象,以便我可以将它们作为 NativeObjects 并在一些 java 映射中管理它们。 但是我发现的所有克隆方法都有缺陷。 我想要对象的精确快照。 例如,如果两个对象 a 和 b 中的每一个都包含引用同一对象 c 的字段(例如 a.fa 和 b.fb),则当使用jQuery.extend()克隆时(例如)字段a.fa和b.fb克隆的 a 和 b 将引用 c 的不同克隆,而不是引用一个相同的克隆。 以及许多其他边缘问题。 我还尝试使用 Cloner(不仅是绑定)克隆整个 ScriptEngine,我还尝试使用 Rhino 的 js 引擎并克隆整个范围(而不是捆绑的 ScriptEngine 包装器)。 但是堆损坏问题仍然存在。 为什么我需要这样做 我需要这个,因为我必须能够将整个
  • 如何在Java中备份ArrayList?(How to backup ArrayList in Java?)
    问题 我有一些数据存储为ArrayList 。 当我要备份此数据时,java会永远绑定两个对象。 这意味着当我更改数据ArrayList值时,此更改将备份。 我试图将数据中的值分别复制到循环中进行备份,并尝试使用data.clone()方法-没有任何帮助。 回答1 我认为您需要.clone()单个对象。 克隆ArrayList并不“深入”。 它只会克隆对对象的引用。 回答2 您的问题不是很清楚。 如果您克隆()ArrayList,则如果更改原始内容(即,如果添加或删除元素),则克隆将不会被修改,但是它是“浅拷贝”,因此,如果您更改原始对象中的实际对象,它们将被修改。也可以在克隆中更改。 如果要进行“深层复制”,以使对实际对象的更改不会影响克隆中对象的备份,则需要创建一个新的ArrayList,然后遍历原始的ArrayList,并为每个元素克隆它进入新的。 像在 ArrayList backup = new ArrayList(); for (Object obj : data) backup.add(obj.clone()); 回答3 我假设data是您要备份的ArrayList的名称。 如果是这样,您应该知道clone不是很深-它只会创建在其上被调用的对象的副本,在这种情况下为列表。 如果是深层克隆,它将使用其中对象的克隆填充新列表。 由于不深,如果更改列表中包含的对象
  • 克隆JavaScript对象? [复制](Cloning a JavaScript object? [duplicate])
    问题 这个问题已经在这里有了答案: 8年前关闭。 可能重复: 如何克隆js对象? 这是创建javascript对象的另一种方法(使用对象文字表示法而不是函数): user = { name: "Foo", email: "bar@baz.com" } 有没有办法克隆此对象或它是单例对象? 回答1 试试这个: var clone = (function(){ return function (obj) { Clone.prototype=obj; return new Clone() }; function Clone(){} }()); 这是怎么回事。 克隆是一个伪构造函数。 我们将要克隆的对象分配给Clone构造函数的原型。 我们使用'new'来调用Clone,因此构造的对象将原始对象作为其构造函数的原型aka(非标准) __proto__ 。 克隆的对象将共享原始对象的所有属性,而不复制任何内容。 如果为克隆对象的属性分配了新值,则它们不会干扰原始对象。 并且不需要篡改内置组件。 请记住,新创建的对象的对象属性将引用与克隆对象的同名属性相同的对象。 为克隆的属性分配新值不会干扰原始属性,但为克隆的对象属性分配值会干扰原始属性。 在chrome或firebug控制台中尝试以下操作: var user = { name: "Foo", email: "bar@baz.com" }
  • 在Java中,什么是浅表副本?(In Java, what is a shallow copy?)
    问题 java.util.Calendar.clone()返回“ ...具有相同属性的新日历”,并返回“此日历的浅表副本”。 正如在SO上回答的那样,这似乎不是一个浅表副本。 该问题被标记为与语言无关, Java似乎没有遵循与语言无关的定义。 在我遍历代码时,我注意到结构和元素被复制到了这个新对象,而不仅仅是语言不可知的结构。 在Java中,什么是浅表副本? 它与Java深层副本(如果存在)有何不同? 回答1 浅表副本仅复制类中引用的值。 深拷贝将复制值。 给出: class Foo { private Bar myBar; ... public Foo shallowCopy() { Foo newFoo = new Foo(); newFoo.myBar = myBar; return newFoo; } public Foo deepCopy() { Foo newFoo = new Foo(); newFoo.myBar = myBar.clone(); //or new Bar(myBar) or myBar.deepCopy or ... return newFoo; } } Foo myFoo = new Foo(); Foo sFoo = myFoo.shallowCopy(); Foo dFoo = myFoo.deepCopy(); myFoo.myBar ==
  • 在javascript中克隆不可枚举的属性(Cloning Non enumerable properties in javascript)
    问题 我在对象中有所有不可枚举的属性,我想克隆那个对象。 我的问题不可枚举属性没有被克隆。 以下面的例子为例 Object.defineProperty(this, 'prop', { get: function () { return prop; }, set: function (value) { prop= value; } }); Object.defineProperty(this, 'newprop', { get: function () { return newprop; }, set: function (value) { newprop= value; } }); 例如,我的对象中有以上两个属性使用以下方法进行克隆,我的属性没有被克隆我相信这是因为它们是不可枚举的。 var newObject = $.extend({},oldObject); var newObject= Object.assign({},oldobject); 如何在 javascript 中复制不可枚举的属性。 回答1 如果一个或多个属性不可枚举,您希望如何自动神奇地枚举它们? 既然你知道他们的名字,你应该做这样的事情: var sourceObj = this; var targetObj = {}; ["prop", "otherProperty"].forEach(function
  • 你如何克隆一个BufferedImage(How do you clone a BufferedImage)
    问题 我有一个其中包含许多bufferedimages的对象,我想创建一个新对象,将所有bufferedimages复制到新对象中,但是这些新图像可能会更改,并且我不希望通过更改原始对象图像来更改新对象图像。 明白了吗? 这有可能做到吗,请问有人可以建议一个好方法吗? 我曾经想到过getSubImage,但在某处阅读过,对子映像的任何更改都会重新关联到父映像。 我只希望能够获得BufferedImage的全新完全独立副本或克隆 回答1 像这样吗? static BufferedImage deepCopy(BufferedImage bi) { ColorModel cm = bi.getColorModel(); boolean isAlphaPremultiplied = cm.isAlphaPremultiplied(); WritableRaster raster = bi.copyData(null); return new BufferedImage(cm, raster, isAlphaPremultiplied, null); } 回答2 我这样做: public static BufferedImage copyImage(BufferedImage source){ BufferedImage b = new BufferedImage(source
  • 如何制作数组的浅表副本?(How to make a shallow copy of an array?)
    问题 我将二维数组作为属性传递给用户控件。 我在那里将这些值存储在另一个二维数组中: int[,] originalValues = this.Metrics; 稍后,我更改this.Metrics值。 但是现在,如果我从originalValues检索值,则可以从this.Metrics获取更改后的值。 如何复制this.Metrics的元素,而不仅仅是获取数组的引用? 回答1 您可以克隆一个数组,并复制它: int[,] originalValues = (int[,])this.Metrics.Clone(); 回答2 我不知道我从哪里得到的,但这对我来说很好。 public static class GenericCopier<T> //deep copy a list { public static T DeepCopy(object objectToCopy) { using (MemoryStream memoryStream = new MemoryStream()) { BinaryFormatter binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(memoryStream, objectToCopy); memoryStream.Seek(0, SeekOrigin.Begin