相关疑难解决方法(0)

在JavaScript中深度克隆对象的最有效方法是什么?

克隆JavaScript对象的最有效方法是什么?我已经看到obj = eval(uneval(o));被使用,但这是非标准的,只有Firefox支持.

我做过类似的事情,obj = JSON.parse(JSON.stringify(o));但质疑效率.

我也看到了具有各种缺陷的递归复制功能.
我很惊讶没有规范的解决方案.

javascript clone object

5181
推荐指数
48
解决办法
189万
查看次数

如何正确克隆JavaScript对象?

我有一个对象,x.我想把它复制为对象y,这样改变y就不要修改了x.我意识到复制从内置JavaScript对象派生的对象将导致额外的,不需要的属性.这不是问题,因为我正在复制我自己的一个文字构造的对象.

如何正确克隆JavaScript对象?

javascript clone javascript-objects

2922
推荐指数
42
解决办法
176万
查看次数

JavaScript多维数组

任何人都可以给我一个带有多维输入数组的JavaScript示例/示例吗?希望你能提供帮助,因为我还是JavaScript新手.

就像输入2行和2列时一样,它的输出将是2行输入和2列输入.

像这样:

[input][input]                
[input][input]
Run Code Online (Sandbox Code Playgroud)

javascript multidimensional-array

141
推荐指数
7
解决办法
48万
查看次数

如何在javascript中深度克隆

你如何深度克隆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

95
推荐指数
6
解决办法
10万
查看次数

为什么在JavaScript中更改数组会影响数组的副本?

我写了以下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,然后警告两者myArraycopyOfMyArray.不知何故,当我执行操作时copyOfMyArray,似乎执行相同的操作myArray.

然后代码使用数字值执行相同的操作:它声明一个变量myNumber并将其设置为数字值.然后它声明第二个变量copyOfMyNumber并将其设置为myNumber.它执行操作copyOfMyNumber,然后警告两者myNumbercopyOfMyNumber.在这里,我得到预期的行为:对不同的价值观myNumbercopyOfMyNumber.

数组和JavaScript中的数字有什么区别,它似乎更改数组会更改数组副本的值,而更改数字不会更改数字副本的值?

我猜测由于某种原因,数组是通过引用引用的,而数字是按值引用的,但为什么呢?我如何知道其他对象的行为?

javascript

70
推荐指数
6
解决办法
5万
查看次数

在javascript中将对象数组复制到另一个数组中(Deep Copy)

使用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)

如何将数组的深层副本复制到另一个数组中,以便在复制数组中进行更改时不会修改原始数组.

javascript arrays google-chrome deep-copy node.js

19
推荐指数
3
解决办法
4万
查看次数

如何在Jasmine.js中使用带有toHaveBeenCalledWith的间谍和一个可变数组?

我有一些代码调用一个回调函数与一个数组作为单个参数.调用回调后,代码会更改数组内容.它与此代码类似:

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也会失败.可变对象也会出现同样的问题.

我该如何测试这样的代码?

javascript unit-testing jasmine

7
推荐指数
1
解决办法
3083
查看次数

javascript - 如何在没有引用的情况下克隆数组

我正在尝试将Array克隆到一个新的,我希望克隆的数组没有引用原始副本

我知道有splicefrom方法,但这些方法的新数组都引用了原始数组

例如

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的引用?

谢谢!

javascript

5
推荐指数
1
解决办法
5173
查看次数

如何在reactjs中更改数组的克隆而不更改原始数组

我的组件中有一个状态,我想在单击“保存”按钮时克隆该状态,并更改和删除克隆的某些属性,然后发布到后端,但是当我更改克隆数组时,原始状态也会改变;我不知道该怎么办,我追踪了克隆数组的所有方法,但所有这些方法都没有帮助我;下面是我的代码:

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

javascript jsx ecmascript-6 reactjs

4
推荐指数
1
解决办法
590
查看次数

Array slice()提供引用而不是值

我有一个文件,我正在导出这样的对象:

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 typescript angular

3
推荐指数
1
解决办法
198
查看次数