克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));被使用,但这是非标准的,只有Firefox支持.
我做过类似的事情,obj = JSON.parse(JSON.stringify(o));但质疑效率.
我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.
我有一个对象,x.我想把它复制为对象y,这样改变y就不要修改了x.我意识到复制从内置JavaScript对象派生的对象将导致额外的,不需要的属性.这不是问题,因为我正在复制我自己的一个文字构造的对象.
如何正确克隆JavaScript对象?
任何人都可以给我一个带有多维输入数组的JavaScript示例/示例吗?希望你能提供帮助,因为我还是JavaScript新手.
就像输入2行和2列时一样,它的输出将是2行输入和2列输入.
像这样:
[input][input]
[input][input]
Run Code Online (Sandbox Code Playgroud) 你如何深度克隆Javascript对象?
我知道基于类似的框架有各种各样的功能JSON.parse(JSON.stringify(o)),$.extend(true, {}, o)但我不想使用这样的框架.
什么是创建深度克隆的最优雅或最有效的方法.
我们关心像克隆数组这样的边缘情况.不打破原型链,处理自我引用.
我们不关心支持复制DOM对象,因为因为.cloneNode这个原因而存在.
由于我主要想使用深度克隆来node.js使用V5引擎的ES5功能是可以接受的.
[编辑]
在任何人建议让我提及之前,通过原型继承对象并克隆它来创建副本之间存在明显差异.前者使原型链变得混乱.
[进一步编辑]
在阅读完答案后,我发现了一个令人讨厌的发现,即克隆整个物体是一个非常危险和困难的游戏.以下面的基于闭包的对象为例
var o = (function() {
var magic = 42;
var magicContainer = function() {
this.get = function() { return magic; };
this.set = function(i) { magic = i; };
}
return new magicContainer;
}());
var n = clone(o); // how to implement clone to support closures
Run Code Online (Sandbox Code Playgroud)
有没有办法编写克隆对象的克隆函数,在克隆时具有相同的状态,但是如果不在oJS中编写JS解析器,则无法改变状态.
这样的功能不再需要现实世界.这仅仅是学术兴趣.
我写了以下JavaScript:
var myArray = ['a', 'b', 'c'];
var copyOfMyArray = myArray;
copyOfMyArray.splice(0, 1);
alert(myArray); // alerts ['b','c']
alert(copyOfMyArray); // alerts ['b','c']
var myNumber = 5;
var copyOfMyNumber = myNumber;
copyOfMyNumber = copyOfMyNumber - 1;
alert(myNumber); // alerts 5
alert(copyOfMyNumber); // alerts 4
Run Code Online (Sandbox Code Playgroud)
此代码声明一个变量myArray并将其设置为数组值.然后它声明第二个变量copyOfMyArray并将其设置为myArray.它执行操作copyOfMyArray,然后警告两者myArray和copyOfMyArray.不知何故,当我执行操作时copyOfMyArray,似乎执行相同的操作myArray.
然后代码使用数字值执行相同的操作:它声明一个变量myNumber并将其设置为数字值.然后它声明第二个变量copyOfMyNumber并将其设置为myNumber.它执行操作copyOfMyNumber,然后警告两者myNumber和copyOfMyNumber.在这里,我得到预期的行为:对不同的价值观myNumber和copyOfMyNumber.
数组和JavaScript中的数字有什么区别,它似乎更改数组会更改数组副本的值,而更改数字不会更改数字副本的值?
我猜测由于某种原因,数组是通过引用引用的,而数字是按值引用的,但为什么呢?我如何知道其他对象的行为?
使用slice(0)和concat()在javascript中将对象数组复制到另一个数组中不起作用.
我已经尝试了以下测试,如果我使用这个获得深度复制的预期行为.但是,在复制的数组中进行更改后,原始数组也会被修改.
var tags = [];
for(var i=0; i<3; i++) {
tags.push({
sortOrder: i,
type: 'miss'
})
}
for(var tag in tags) {
if(tags[tag].sortOrder == 1) {
tags[tag].type = 'done'
}
}
console.dir(tags)
var copy = tags.slice(0)
console.dir(copy)
copy[0].type = 'test'
console.dir(tags)
var another = tags.concat()
another[0].type = 'miss'
console.dir(tags)
Run Code Online (Sandbox Code Playgroud)
如何将数组的深层副本复制到另一个数组中,以便在复制数组中进行更改时不会修改原始数组.
我有一些代码调用一个回调函数与一个数组作为单个参数.调用回调后,代码会更改数组内容.它与此代码类似:
function myCode( callback ) {
var someArray = [ 1, 2, 3, 4 ];
callback( someArray );
// change someArray in arbitrary ways
someArray.splice( 2 );
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我想验证是否使用正确的数组内容调用回调.使用Jasmine.js我会像这样编写我的规范:
describe( "My code", function() {
var callback;
beforeEach( function() {
callback = jasmine.createSpy( "My callback" );
myCode( callback );
});
it( "calls the callback and passes the correct array", function() {
expect( callback ).toHaveBeenCalledWith( [ 1, 2, 3, 4 ] );
});
});
Run Code Online (Sandbox Code Playgroud)
这失败了.问题是,Jasmine.js记录了数组,但没有复制它.由于在调用之后更改了数组,所以即使实际调用满足了期望,expect() - Line也会失败.可变对象也会出现同样的问题.
我该如何测试这样的代码?
我正在尝试将Array克隆到一个新的,我希望克隆的数组没有引用原始副本
我知道有splice和from方法,但这些方法的新数组都引用了原始数组
例如
let original = [ [1,2], [3,4] ];
let cloned = Array.from(original); // this will copy everything from original
original[0][0] = -1;
console.log(cloned[0][0]); // the cloned array element value changes too
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用循环cloned[i][j] = original[i][j],但结果是一样的
如何使用原始Array中具有相同值的每个元素创建一个新Array,但是克隆的Array应该没有对原始Array的引用?
谢谢!
我的组件中有一个状态,我想在单击“保存”按钮时克隆该状态,并更改和删除克隆的某些属性,然后发布到后端,但是当我更改克隆数组时,原始状态也会改变;我不知道该怎么办,我追踪了克隆数组的所有方法,但所有这些方法都没有帮助我;下面是我的代码:
.
.
.
const [steps , setSteps] = useState([
{
id: 1,
// content: "item 1 content",
subItems: [
{
id: 10,
isNew : false ,
hasWorkflow : true ,
title : 'SubItem 10 content' ,
approverType : 1,
approverId : 0 ,
},
{
id: 11,
isNew : false ,
hasWorkflow : true ,
title : 'SubItem 11 content' ,
approverType : 2,
approverId : 1 ,
}
]
},
{
id: 2,
// content: "item 2 content", …Run Code Online (Sandbox Code Playgroud) 我有一个文件,我正在导出这样的对象:
export const LINECHART2_DATA = {
series: [{
data: [],
name: 'HR',
},
{
etc...
}]
}
Run Code Online (Sandbox Code Playgroud)
我这样导入它:
import { LINECHART2_DATA } from '../chart-options/options';
Run Code Online (Sandbox Code Playgroud)
我有以下方法:
prepareLineChartDataContainer(bed: BedDetails) {
//Clear data to prepare for new bed
if (bed.seriesContainer == null) {
bed.seriesContainer = LINECHART2_DATA.series.slice();
} else {
bed.seriesContainer.forEach(series => {
series.data.length = 0;
});
}
//Add data to seriesContainer
this.vitalSigns.forEach(vs => {
bed.timeWindows.forEach(tw => {
bed.seriesContainer.find(series => series.name == vs).data.push(tw['avg' + vs]);
});
});
}
Run Code Online (Sandbox Code Playgroud)
正如您在上面所看到的,我正在切割系列数组LINECHART2_DATA,然后将一些数据推送到它.当bed使用null seriesContainer …
javascript ×10
clone ×2
angular ×1
arrays ×1
deep-copy ×1
ecmascript-6 ×1
jasmine ×1
jsx ×1
node.js ×1
object ×1
reactjs ×1
typescript ×1
unit-testing ×1