2016-02-22 2 views
4

C# имеет высокую производительность массива копирования функция копирования массивов вместо:Как скопировать TypedArray в другой TypedArray?

Array.Copy(source, destination, length) 

Это быстрее, чем делать это вручную т.е. .:

for (var i = 0; i < length; i++) 
    destination[i] = source[i]; 

Ищу эквивалентном высокой копии производительности функция для копирования массивов на месте, для Int32Array и Float32Array в Javascript и не может найти таких функций:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

Ближайший экземпляр «copyWithin», который выполняет внутреннюю копию внутри массива.

Есть ли встроенная функция высокопроизводительной копии для TypedArrays на месте?

Plan B, есть ли встроенная функция клонов с высокой производительностью? (EDIT: выглядит как slice() - ответ на этот вопрос)

+0

u можете использовать Array.join() –

+0

@ علاء الدين, 'Array.join'? который даже не возвращает массив. – trincot

+0

Возможный дубликат [Копирование массива по значению в JavaScript] (http://stackoverflow.com/questions/7486085/copying-array-by-value-in-javascript) –

ответ

10

Вы ищете .set, который позволяет установить значения массива используя входной массив (или TypedArray), необязательно начинающийся с некоторого смещения в целевом массиве:

destination.set(source); 
destination.set(source, offset); 

Или, чтобы установить ограниченное количество входного массива:

destination.set(source.slice(limit), offset); 

Если вместо этого вы хотите, чтобы создать новый TypedArray, вы можете просто использовать .slice:

source.slice(); 
+0

Ах, вот и все, так очевиден в ретроспективе, спасибо! –

+3

BTW Если вы ищете эффективность, вы можете использовать 'source.subarray (limit)' вместо 'slice', поэтому создается только новое представление и используется одно и то же базовое хранилище данных (не требуется промежуточная копия данных). –

1

Вы можете клонировать массив, используя slice(0);.

var clone = myArray.slice(0); 

И вы можете сделать это нативный метод:

Array.prototype.clone = function() { 
    return this.slice(0); 
}; 

Производительность link по сравнению с петлей

+0

['slice'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice) - это путь. Если это недостаточно высокопроизводительно, то downvoter должен сжать JavaScript, а не мессенджер. – trincot

+0

Вам не нужно '0'. См. Дубликат: http://stackoverflow.com/q/7486085/215552 –

+0

@MikeMcCaughan, фактически 0 работает быстрее, и это был вопрос производительности. –

4

клон к СУЩЕСТВУЕТ typedarray :

destination.set(source); 
destination.set(source, offset); 

клон нового typedarray Например: (Это самый быстрый!)

var source = new Uint8Array([1,2,3]); 
var cloned = new Uint8Array(source); 
Смежные вопросы