Простое клонирование/копирование массива в JavaScript
Чтобы клонировать/копировать содержимое массива, все, что вам нужно сделать, это вызвать метод slice, передав 0 в качестве первого аргумента:
var clone = myArray.slice(0);
Код выше создает копию исходного массива; имейте в виду, если в вашем массиве существуют объекты — они хранятся как ссылки; т.е. код выше не делает “deep” клонирование содержимого массива.
Чтобы добавить копирование, как нативный метод к массивам, вы могли бы сделать что-то вроде этого:
Array.prototype.clone = function () < return this.slice(0); >;
Давайте напишем рекурсивную функцию, чтобы копировать массив, который потенциально может иметь вложенные объекты или массивы:
function arrayClone (arr) < var i, copy; if (Array.isArray(arr)) < copy = arr.slice(0); for (i = 0; i < copy.length; i++) < copy[i] = arrayClone(copy[i]); >return copy; > else if (typeof arr === 'object') < throw 'Cannot clone array containing an object!'; >else < return arr; >>
Если вы используете Underscore – можете сделать это еще короче:
function arrayClone (arr) < if (_.isArray(arr)) < return _.map(arr, arrayClone); >else if (typeof arr === 'object') < throw 'Cannot clone array containing an object!'; >else < return arr; >>
С версии ECMAScript 2015 был введен метод Object.assign(), с его помощью глубокое клонирование можно реализовать еще проще:
var clone = Object.assign([], myArray);
Заключение
Если вам нужно глубокое копирование произвольно-вложенных объектов и/или массивов, крошечный node-clone прекрасно с этим справиться. Он будет правильно обрабатывать даже копирование объектов с циклическими ссылками!
Источники
- Clone Arrays with JavaScript
- How to Clone a (Nested) Array in Javascript
Скопируйте массив в JavaScript
В этом посте мы обсудим, как выполнить поверхностную копию массива в JavaScript.
Прежде чем мы начнем, давайте кратко обсудим проблему, связанную с неглубоким копированием. При поверхностной копии значения копируются по ссылке, когда массив вложен. Это означает, что если объект, на который делается ссылка, изменяется, изменения отражаются как в исходном массиве, так и в его копии.
let arr = [ 1 , 2 , 3 , [ 4 , 5 , 6 ] ]
var copy = arr . slice ( ) ;
copy [ 3 ] . pop ( ) ; // изменить копию
console . log ( arr ) ; // [ 1, 2, 3, [ 4, 5 ] ]
console . log ( copy ) ; // [ 1, 2, 3, [ 4, 5 ] ]
Все следующие методы копируют любые вложенные объекты или массивы по ссылке, кроме jQuery. $.extend() метод и Лодаш _.cloneDeep() метод, который выполняет глубокое клонирование.
1. Использование Array.prototype.slice() функция
The slice() метод обычно используется для создания поверхностной копии массива в JavaScript.
Как сделать копию массива на js
Копию массива в js можно получить используя встроенный метод slice():
[1, 2, 3] // убедится в том что это другой массив можно сравнив ссылки на массивы arr === copyArr // false
В качестве альтернативы можно воспользоваться возможностями spread оператора:
[1, 2, 3] arr === copyArr // false
19 октября 2022
Можно несколькими способами сделать копию массива.
- С помощью цикла for :
const array = [1, 2, 3, 'hello', true, [4, 5]]; const arrayCopy = []; for (let i = 0; i array.length; i += 1) arrayCopy[i] = array[i]; > console.log(arrayCopy); // => [1, 2, 3, 'hello', true, [4, 5]] // убеждаемся, что это другой массив console.log(array === arrayCopy); // => false
- С помощью метода map() :
const arrayCopy = array.map((element) => element); console.log(arrayCopy); // => [1, 2, 3, 'hello', true, [4, 5]] console.log(array === arrayCopy); // => false
- С помощью комбинации методов JSON.parse() и JSON.stringify() (подходит для глубокого копирования массивов и объектов):
const arrayCopy = JSON.parse(JSON.stringify(array)); console.log(arrayCopy); // => [1, 2, 3, 'hello', true, [4, 5]] console.log(array === arrayCopy); // => false
- С помощью метода concat() :
const arrayCopy = array.concat([]); console.log(arrayCopy); // => [1, 2, 3, 'hello', true, [4, 5]] console.log(array === arrayCopy); // => false
- С помощью метода Array.from() :
const arrayCopy = Array.from(array); console.log(arrayCopy); // => [1, 2, 3, 'hello', true, [4, 5]] console.log(array === arrayCopy); // => false
Как скопировать массив в Java? Копирование массивов
В статье поговорим о некоторых методах копирования массивов в Java. Этот язык программирования имеет встроенные методы, предназначенные для решения данных задач. С их помощью вы сможете сделать как полную копию массива, так и выполнить копирование некоторых элементов массива.
Методы для копирования массивов в Java
В Java существует довольно много специальных методов для копирования массивов:
1.В первую очередь, хотелось бы упомянуть Object.clone() — этот метод вы можете использовать для полного копирования массива. Соответственно, если вы хотите скопировать массив частично, этот способ вам не подойдёт.
2.Следующий на очереди — System.arraycopy() — по сути, это один из наилучших способов создать частичную копию массива в Java. В этом методе определены следующие параметры: — массив, элементы которого планируем копировать; — индекс элемента; — итоговый (результирующий) массив; — первый элемент итогового массива; — общее число элементов, предназначенных для копирования.
К примеру, написав System.arraycopy(источник, 2, назначения, 5, 7), вы скопируете семь элементов из массива-источника в итоговый массив, начиная со второго индекса источника в пятый индекс результирующего массива.
3. Arrays.copyOf() — подойдёт вам, если планируете выполнить копирование нескольких первых элементов массива либо сделать полную копию массива. Способ не так универсален, как System.arraycopy() , но так же прост в применении.
4. Arrays.copyOfRange() — полезный метод, обеспечивающий частичное копирование массива.
В принципе, для решения большинства задач по полному либо частичному копированию массивов в Java вышеперечисленных методов вам вполне хватит. Только учтите, что методы, встроенные в Java для копирования, годятся лишь для одномерных массивов.
Пришла пора посмотреть на них в действии.
import java.util.Arrays; public class JavaArrayCopyExample < /** * В этом классе мы демонстрируем методы копирования массивов в java * @param args */ public static void main(String[] args) int[] source = ; int[] source1 = ; int[] destination=null; System.out.println("Массив-источник = " + Arrays.toString(source)); destination = copyFirstFiveFieldsOfArrayUsingSystem(source); System.out.println("Копируем первые пять элементов массива, если они есть. Итоговый массив = " + Arrays.toString(destination)); destination = copyFirstFiveFieldsOfArrayUsingSystem(source1); System.out.println("Копируем первые пять элементов массива, если они есть. Итоговый массив = " + Arrays.toString(destination)); destination = copyFullArrayUsingSystem(source); System.out.println("Осуществляем полное копирование массива посредством System.copyarray(). Итоговый массив = " + Arrays.toString(destination)); destination = copyFullArrayUsingClone(source); System.out.println("Осуществляем полное копирование массива посредством clone(). Итоговый массив = " + Arrays.toString(destination)); destination = copyFullArrayUsingArrayCopyOf(source); System.out.println("Осуществляем полное копирование массива посредством Arrays.copyOf(). Итоговый массив = " + Arrays.toString(destination)); destination = copyLastThreeUsingArrayCopyOfRange(source); System.out.println("Копируем последние три элемента массива посредством Arrays.copyOfRange(). Итоговый массив = " + Arrays.toString(destination)); > /** * Данный метод выполняет полное копирование массива посредством Arrays.copyOf() * @param source * @return */ private static int[] copyFullArrayUsingArrayCopyOf(int[] source) return Arrays.copyOf(source, source.length); > /** * Данный метод копирует последние три элемента посредством * Arrays.copyOfRange() * @param source * @return */ private static int[] copyLastThreeUsingArrayCopyOfRange(int[] source) // проверка длины для предотвращения java.lang.ArrayIndexOutOfBoundsException //но для простоты метода мы этого не делаем :) return Arrays.copyOfRange(source, source.length-3, source.length); > /** * Данный метод выполняет полное копирование массива посредством clone() * @param source * @return */ private static int[] copyFullArrayUsingClone(int[] source) return source.clone(); > /** * Данный метод выполняет полное копирование массива посредством System.arraycopy() * @param source * @return */ private static int[] copyFullArrayUsingSystem(int[] source) int[] temp=new int1; System.arraycopy(source, 0, temp, 0, source.length); return temp; > /** * Метод копирует первые пять элементов * посредством System.arraycopy() * @param source * @return */ private static int[] copyFirstFiveFieldsOfArrayUsingSystem(int[] source) < if(source.length >5)< int[] temp=new int[5]; System.arraycopy(source, 0, temp, 0, 5); return temp; >else < int[] temp=new int1; System.arraycopy(source, 0, temp, 0, source.length); return temp; >> >Теперь посмотрим на результат выполнения нашей программы:
Массив-источник = [1, 2, 3, 4, 5, 6, 7, 8, 9] Копируем первые пять элементов массива, если они есть. Итоговый массив = [1, 2, 3, 4, 5] Копируем первые пять элементов массива, если они есть. Итоговый массив = [1, 2, 3] Осуществляем полное копирование массива посредством System.copyarray(). Итоговый массив = [1, 2, 3, 4, 5, 6, 7, 8, 9] Осуществляем полное копирование массива посредством clone(). Итоговый массив = [1, 2, 3, 4, 5, 6, 7, 8, 9] Осуществляем полное копирование массива посредством Arrays.copyOf(). Итоговый массив = [1, 2, 3, 4, 5, 6, 7, 8, 9] Копируем последние три элемента массива посредством Arrays.copyOfRange(). Итоговый массив = [7, 8, 9]Вот и всё. Если же вы хотите получить действительно продвинутые знания по Java, приходите на наш курс: