How to implement deep and shallow copies of arrays and objects
Premise: The difference between primitive data types and object types when assigning values
JavaScript data types are divided into primitive data types and object types. The way they are stored in memory is different, resulting in differences in their assignment. Let’s take a chestnut respectively
1 2 3 4 5 6 7 8 |
|
From the chestnut above, we can see that when the original data type is assigned, the actual data value is given. After the assignment, the two values are the same and will not affect each other. ; The object type gives the reference address of the original data, so the old and new data will affect each other, because it is essentially the same data object , such as the array in the above list
What is a shallow copy?
As the name suggests, shallow copy is a superficial copy method; when the attribute value is an object type, only the reference to the object data is copied, resulting in the old and new data not being completely separated. will also affect each other. Take another example...
1 2 3 4 5 6 7 8 9 10 11 |
|
In the chestnut, array2 is a shallow copy object of array1. The array elements are of primitive data types and will not affect each other (array1[0] ), but array1[3] is an object type and will still affect each other.
How to implement shallow copy
array.concat() or array.slice() in Shangli is a special implementation of shallow copy of array Way.
How to implement it yourself? Wouldn’t it be enough to traverse each attribute of the object/array and then assign it to a new object? The following implementation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
deep copy and its implementation
From shallow copy The explanation is basically understandable. Deep copy is a 'complete' copy. After copying, the old and new data are completely separated. They no longer share the attribute values of the object type and will not affect each other.
Implementation method:
Tricky method JSON.parse(JSON.stringify(Obj))
1 2 3 4 5 6 7 8 |
|
Note: This method cannot deep copy objects whose attribute values are functions. You can try it yourself
2. Implement deep copy
Having implemented shallow copy, think about it It should be that when assigning the object type attribute value, the result is not complete separation, so we need to modify the way of copying the object type attribute value, and call a deep copy on it again, thus realizing the deep copy, as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
Summary
Be sure to understand the reasons for shallow copy: when copying object type data, the reference address is copied, and the same data object is used; so the way to implement deep copy is to copy the object type attribute value Perform deep copy recursively to avoid direct assignment.
The above is the detailed content of How to implement deep and shallow copies of arrays and objects. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



The method of using a foreach loop to remove duplicate elements from a PHP array is as follows: traverse the array, and if the element already exists and the current position is not the first occurrence, delete it. For example, if there are duplicate records in the database query results, you can use this method to remove them and obtain results without duplicate records.

Methods for deep copying arrays in PHP include: JSON encoding and decoding using json_decode and json_encode. Use array_map and clone to make deep copies of keys and values. Use serialize and unserialize for serialization and deserialization.

The performance comparison of PHP array key value flipping methods shows that the array_flip() function performs better than the for loop in large arrays (more than 1 million elements) and takes less time. The for loop method of manually flipping key values takes a relatively long time.

Here's how to convert a MySQL query result array into an object: Create an empty object array. Loop through the resulting array and create a new object for each row. Use a foreach loop to assign the key-value pairs of each row to the corresponding properties of the new object. Adds a new object to the object array. Close the database connection.

PHP's array_group_by function can group elements in an array based on keys or closure functions, returning an associative array where the key is the group name and the value is an array of elements belonging to the group.

The best practice for performing an array deep copy in PHP is to use json_decode(json_encode($arr)) to convert the array to a JSON string and then convert it back to an array. Use unserialize(serialize($arr)) to serialize the array to a string and then deserialize it to a new array. Use the RecursiveIteratorIterator to recursively traverse multidimensional arrays.

Multidimensional array sorting can be divided into single column sorting and nested sorting. Single column sorting can use the array_multisort() function to sort by columns; nested sorting requires a recursive function to traverse the array and sort it. Practical cases include sorting by product name and compound sorting by sales volume and price.

In PHP, an array is an ordered sequence, and elements are accessed by index; an object is an entity with properties and methods, created through the new keyword. Array access is via index, object access is via properties/methods. Array values are passed and object references are passed.
