Maison  >  Questions et réponses  >  le corps du texte

Copier les valeurs d'un tableau

<p>Lors de la copie d'un tableau vers un autre en JavaScript : </p> <pre class="brush:php;toolbar:false;">var arr1 = ['a','b','c']; vararr2 = arr1; arr2.push('d'); // Maintenant, arr1 = ['a','b','c','d']</pre> <p>J'ai réalisé que <code>arr2</code> faisait référence au même tableau que <code>arr1</code>, et non à un nouveau tableau séparé. Comment copier un tableau pour obtenir deux tableaux distincts ? </p>
P粉002546490P粉002546490426 Il y a quelques jours484

répondre à tous(2)je répondrai

  • P粉795311321

    P粉7953113212023-08-21 11:38:17

    En Javascript, la technique de copie profonde dépend des éléments du tableau. Commençons ici.

    Trois types d'éléments

    Les éléments peuvent être : des valeurs littérales, des structures littérales ou des prototypes.

    // 字面值(类型1)
    const booleanLiteral = true;
    const numberLiteral = 1;
    const stringLiteral = 'true';
    
    // 字面结构(类型2)
    const arrayLiteral = [];
    const objectLiteral = {};
    
    // 原型(类型3)
    const booleanPrototype = new Bool(true);
    const numberPrototype = new Number(1);
    const stringPrototype = new String('true');
    const arrayPrototype = new Array();
    const objectPrototype = new Object(); // 或者 `new function () {}
    

    À partir de ces éléments, nous pouvons créer trois types de tableaux.

    // 1) 字面值数组(布尔值、数字、字符串) 
    const type1 = [ true, 1, "true" ];
    
    // 2) 字面结构数组(数组、对象)
    const type2 = [ [], {} ];
    
    // 3) 原型对象数组(函数)
    const type3 = [ function () {}, function () {} ];
    

    La technologie de copie profonde dépend de ces trois types de tableaux

    En fonction du type d'éléments du tableau, nous pouvons utiliser diverses techniques pour effectuer des copies approfondies.

    Technologie de copie approfondie

    Benchmarks

    https://www.measurethat.net/Benchmarks/Show/17502/0/deep-copy-comparison

    • Tableau littéral (type 1)
      Des performances maximales peuvent être obtenues en utilisant [ ...myArray ]myArray.splice(0)myArray.slice()myArray.concat() 技术来深拷贝只包含字面值(布尔值、数字和字符串)的数组;其中在Chrome中,slice() 的性能最高,在Firefox中,扩展运算符 ....

    • Tableau de valeurs littérales (type 1) et tableau de structures littérales (type 2)
      Vous pouvez utiliser la technique JSON.parse(JSON.stringify(myArray)) pour copier en profondeur des valeurs littérales (valeurs booléennes, nombres, chaînes) et des structures littérales (tableaux, objets), mais les objets prototypes ne peuvent pas être copiés.

    • Tous les tableaux (type 1, type 2, type 3)

      • Vous pouvez utiliser le cloneDeep(myArray) de Lo-dash ou le extend de jQuerycloneDeep(myArray)jQueryextend(true, [], myArray) 技术来深拷贝所有类型的数组。其中Lodash的 cloneDeep() (true, [], myArray) technique pour copier en profondeur des tableaux de tous types. Parmi eux, la technologie cloneDeep() de Lodash est la plus performante.
      • Pour ceux qui évitent d'utiliser des bibliothèques tierces, la fonction personnalisée ci-dessous peut copier en profondeur tous les types de tableaux avec des performances inférieures à celles de cloneDeep(),但高于 extend(true).
    function copy(aObject) {
      // 防止未定义的对象
      // if (!aObject) return aObject;
    
      let bObject = Array.isArray(aObject) ? [] : {};
    
      let value;
      for (const key in aObject) {
    
        // 防止自引用到父对象
        // if (Object.is(aObject[key], aObject)) continue;
        
        value = aObject[key];
    
        bObject[key] = (typeof value === "object") ? copy(value) : value;
      }
    
      return bObject;
    }
    

    Alors pour répondre à cette question...

    Question

    var arr1 = ['a','b','c'];
    var arr2 = arr1;
    

    Réponse

    Parce que arr1 是一个包含字面值(布尔值、数字或字符串)的数组,你可以使用上面讨论的任何深拷贝技术,其中 slice() 和扩展运算符 ... a les performances les plus élevées.

    arr2 = arr1.slice();
    arr2 = [...arr1];
    arr2 = arr1.splice(0);
    arr2 = arr1.concat();
    arr2 = JSON.parse(JSON.stringify(arr1));
    arr2 = copy(arr1); // 需要自定义函数,上面已提供
    arr2 = _.cloneDeep(arr1); // 需要Lo-dash.js
    arr2 = jQuery.extend(true, [], arr1); // 需要jQuery.js
    

    répondre
    0
  • P粉217784586

    P粉2177845862023-08-21 09:59:42

    Utilisez ceci :

    let oldArray = [1, 2, 3, 4, 5];
    
    let newArray = oldArray.slice();
    
    console.log({newArray});

    répondre
    0
  • Annulerrépondre