相关疑难解决方法(0)

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

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

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

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

javascript clone object

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

创建多维数组的副本,而不是引用 - JavaScript

可能重复:
克隆JavaScript对象的最有效方法是什么?

这也被称为"深度复制",我发现了一些文章.最接近的似乎是这个,但是它适用于jQuery - 我试图在没有库的情况下这样做.

我也在两个地方看到过这样的事情:

arr2 = JSON.decode(JSON.encode(arr1));
Run Code Online (Sandbox Code Playgroud)

但这显然效率低下.也可以单独循环和复制每个值,并在所有数组中重复.这看起来很累人也很低效.

那么复制JavaScript多维数组的最有效的非库方式是[[a],[b],[c]]什么?如果有必要,我对"非IE"方法非常满意.

谢谢!

javascript arrays copy

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

使用$ .extend进行jQuery深度/递归复制

我试图使用jQuery $ .extend合并两个对象.

使用以下代码,我试图提醒("Ball - Stump - Umpire").但目前的输出是("Undefined - Stump - Umpire").它没有实现深度(递归)副本.我们如何纠正这个?

 $(document).ready(function () {

        debugger;

        //$.extend
        var obj3 = { throwable: { text1: 'Ball' }, text3: 'Umpire' };
        var obj4 = { throwable: { text4: 'Bat' }, text2: 'Stump' }

        //Simple Copy
        var result1 = $.extend(obj3, obj4);
        //alert(result1.throwable.text4 + " - " + result1.text2 + " - " + result1.text3);


        //Deep Copy
        //First parameter is passed as Boolean true to accomplish deep (recursive) copy
        var result2 = $.extend(true, obj3, …
Run Code Online (Sandbox Code Playgroud)

jquery

12
推荐指数
1
解决办法
6949
查看次数

我不能复制数组

我不能复制数组.

var Mycollection = new Array("James","Jonh","Mary");
var Mycollection2 = Mycollection;
Run Code Online (Sandbox Code Playgroud)

第一个数组中的任何更改也会在第二个数组中进行.

Mycollection.pop();
console.log(Mycollection.toString()) // ["James","Jonh"]
console.log(Mycollection2.toString())// ["James","Jonh"]
Run Code Online (Sandbox Code Playgroud)

但是,当我使用文本类型的变量时,不会发生这种情况

javascript arrays web

12
推荐指数
1
解决办法
625
查看次数

理解数组时我错过了什么?

将数组分配给另一个变量时,将传递引用而不是值.当您使用==运算符比较两个数组并且它返回时,会确认这一点true

var a = [[1,2],[3,4],[5,6]];
var b = a; // b = [[1,2],[3,4],[5,6]]
var c = [].concat(a); // c = [[1,2],[3,4],[5,6]]

a == b; //true
a == c; //false
Run Code Online (Sandbox Code Playgroud)

通过上面的输入,当我修改数组时b,它会改变数组a,但不是c.

b.push([7,8]); // b = [[1,2],[3,4],[5,6], [7,8]]
a; //a = [[1,2],[3,4],[5,6], [7,8]]
c; //c = [[1,2],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)

但是当我在下面做的时候,它会发生变异c.

b[0].push(5); // b = [[1,2,5],[3,4],[5,6], [7,8]]
a; //a = [[1,2,5],[3,4],[5,6], [7,8]]
c; //c = [[1,2,5],[3,4],[5,6]]
Run Code Online (Sandbox Code Playgroud)

为什么会这样?使用改变数组的数组方法会发生此行为.

javascript

8
推荐指数
1
解决办法
240
查看次数

完全基本的Javascript参考问题

以下Javascript控制台:

var a = {'foo': []};
var b = {};

for (var key in a) {
   b[key] = a[key];
}

a['foo'].push(1);

console.log(b);
Run Code Online (Sandbox Code Playgroud)

产量:

Object foo=[1]

我想为a中的每个键的每个数组的b中的值创建一个副本.有没有更简单的方法?

javascript deep-copy

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

如何复制或复制数组数组

我正在尝试创建一个复制数组数组的函数.我试过blah.slice(0); 但它只复制引用.我需要复制一份原版完整的原件.

我在http://my.opera.com/GreyWyvern/blog/show.dml/1725165找到了这个原型方法

Object.prototype.clone = function() {
  var newObj = (this instanceof Array) ? [] : {};
  for (i in this) {
    if (i == 'clone') continue;
    if (this[i] && typeof this[i] == "object") {
      newObj[i] = this[i].clone();
    } else newObj[i] = this[i]
  } return newObj;
};
Run Code Online (Sandbox Code Playgroud)

它工作,但搞砸了我正在使用的jQuery插件 - 所以我需要把它变成一个函数......并且递归不是我最强的.

非常感谢您的帮助!

干杯,

javascript

6
推荐指数
1
解决办法
2119
查看次数

对于JavaScript多维数组的深层副本,深入一层似乎就足够了。这是真的吗?

注意:我只是一个新手程序员,所以这个问题的核心可能是明显的错误或误解。

本质上,我需要将JavaScript中的“按值”多维数组深度复制到未知深度。我认为这将需要一些复杂的递归,但是似乎在JavaScript中,您只需要复制一个级别就可以按值复制整个数组。

举个例子,这是我的测试代码,它使用了一个故意卷积的数组。

function test() {
  var arr = [ ['ok1'],[],[ [],[],[ [], [ [ ['ok2'], [] ] ] ] ] ];
  var cloned = cloneArray(arr);
  arr = '';   // Delete the original
  alert ( cloned );
}


function cloneArray(arr) {  
  // Deep copy arrays. Going one level deep seems to be enough.
  var clone = [];
  for (i=0; i<arr.length; i++) {
    clone.push( arr[i].slice(0) )
  }
  return clone;
}
Run Code Online (Sandbox Code Playgroud)

在我运行此测试(Ubuntu上最新稳定的Chrome和Firefox)的过程中,即使删除了原始数组,即使数组最深的部分也似乎已成功通过克隆中的值成功复制,即使slice_()复制”仅深入了一层。这是JavaScript中的标准行为吗?我可以依靠它来运行较旧的浏览器吗?

javascript arrays multidimensional-array

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

Javascript中引用的对象数组数组

我有一个数组如下

var sample = [{a:1, b: 1, c:1}, {a:1, b: 1, c:1}, {a:1, b: 1, c:1}];
Run Code Online (Sandbox Code Playgroud)

然后我运行下面的代码,并尝试groupsOfItems[0].sample[0].a = 10, groupsOfItems[0].sample[0].a,groupsOfItems[1].sample[0].agroupsOfItems[2].sample[0].a获得变更为10.

我该如何防止这种情况?

var sample = [{a:1, b: 1, c:1}, {a:1, b: 1, c:1}, {a:1, b: 1, c:1}];


    var groupsOfItems = [];

    for(let i = 0; i < 10; i++) {
        var item = {};
        item.sample = _.clone(sample);
        groupsOfItems.push(item);
    }



  groupsOfItems[0].sample[0].a = 10
  
  console.log(groupsOfItems[0].sample[0].a,groupsOfItems[1].sample[0].a,groupsOfItems[2].sample[0].a);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Run Code Online (Sandbox Code Playgroud)

javascript arrays reference underscore.js

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

javascript数组排序

barValues是我传递给函数的数组.在函数中我有这个:

alert(barValues);

var sortedBarValues = barValues;
sortedBarValues.sort(function(a,b){return b - a});

alert(barValues);
Run Code Online (Sandbox Code Playgroud)

我试图最终得到两个阵列.barValues是原始数组,sortedBarValues是该数组的副本,现在已经排序.

但是,通过这两个警报,我发现barValues也被排序了.这是为什么?制作数组副本的正确方法是什么,以便将其与原始数组分开?

javascript arrays sorting

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

Javascript Split Array

我正在尝试编写一个自定义字符串拆分函数,它比我预期的更难.

基本上,我传入一个字符串和一个字符串将拆分的值数组,它将返回一个子字符串数组,删除空字符串并包括它分割的值.如果字符串可以通过两个不同的值在同一位置拆分,则较长的字符串优先.

那是,

split("Go ye away, I want some peace && quiet. & Thanks.", ["Go ", ",", "&&", "&", "."]);
Run Code Online (Sandbox Code Playgroud)

应该回来

["Go ", "ye away", ",", " I want some peace ", "&&", " quiet", ".", " ", "&", " Thanks", "."]
Run Code Online (Sandbox Code Playgroud)

你能想到一个相当简单的算法吗?如果有一种内置的方式在Javascript(我不认为有)这样做,它会更好.

javascript arrays split

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