【问题标题】:Slice array with objects and get array with objects copies [duplicate]用对象切片数组并用对象副本获取数组[重复]
【发布时间】:2014-12-23 11:54:11
【问题描述】:

当我创建一个包含对象的数组切片时,新数组仍然引用初始数组中的对象。如何使用对象副本制作切片?

var obj1 = {name: 'object1'};
var obj2 = {name: 'object2'};
var array = [obj1, obj2];
var arraySlice = array.slice(0, 1);
arraySlice[0].name = 'object1RENAMED';
console.log(array[0].name);
console.log(arraySlice[0].name);

http://jsfiddle.net/eqgj873h/

打印:

object1RENAMED
object1RENAMED

【问题讨论】:

    标签: javascript arrays javascript-objects slice


    【解决方案1】:

    在我们的例子中,您对值有相同的引用(值是对象),这就是您可以更改不同数组中的值的原因。您需要创建一个深度克隆/副本:

    var arraySlice = JSON.parse(JSON.stringify(array.slice(0, 1)));
    

    如果你使用 jQuery,你可以这样做

    var arraySlice = $.extend(true, [], array.slice(0, 1));
    

    演示:http://jsfiddle.net/eqgj873h/2/

    【讨论】:

      【解决方案2】:

      您正在制作数组的浅拷贝,而不是深拷贝,因此两个数组仍然引用相同的对象。您还需要克隆对象。

      var arraySlice = JSON.parse(JSON.stringify(array.slice(0, 1)));
      

      这个克隆代码来自

      What is the most efficient way to deep clone an object in JavaScript?

      【讨论】:

      • 感谢您提供此链接!
      【解决方案3】:

      这是一个递归函数 (cloneObj),它可以让您的生活更轻松。它使用Array.map 在所有级别上克隆Array 中的对象。

      var array = [{name: 'object1'}, {name: 'object2'}];
      Helpers.log2Screen('array initially:<br>'+Object.print(array));
      
      var arraySlice  = cloneObj(array);
      
      // change names in clone:
      arraySlice[0].name = "changed";
      arraySlice[1].name = "DEMO";
      arraySlice[1].addedProp = [{a: 1, b: 2}, {a: 2, b:3}];
      
      Helpers.log2Screen('arraySlice (clone, changed):<br>'+Object.print(arraySlice));
      Helpers.log2Screen('array didn\'t change, still:<br>'+Object.print(array));
      
      
      function cloneObj(obj) {
          
          // clone the whole enchillada, recursive
          function clone(o, curr) {
              for (var l in o){
                  if (!o.hasOwnProperty(l)) { continue; }
                  if (o[l] instanceof Object) {
                      curr[l] = cloneObj(o[l]);
                  } else {
                      curr[l] = o[l];
                  }
              }
              return curr;
          }
          
          return obj instanceof Array 
                   ? obj.slice().map( function (v) { return cloneObj(v); } )
                   : obj instanceof Date 
                     ? new Date(obj.getTime())
                     : obj instanceof Object 
                       ? clone(obj, {})
                       : obj;
      }
      &lt;script src="https://rawgit.com/KooiInc/Helpers/master/Helpers-min.js"&gt;&lt;/script&gt;

      【讨论】:

        猜你喜欢
        • 2020-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        • 1970-01-01
        • 1970-01-01
        • 2019-04-12
        • 1970-01-01
        相关资源
        最近更新 更多