metodos - recorrer array de objetos javascript
¿Cuál es la forma más sencilla de copiar un objeto ArrayBuffer? (5)
Hmmm ... si es el Uint8Array que quieres cortar (lo que lógicamente debería ser), esto puede funcionar.
if (!Uint8Array.prototype.slice && ''subarray'' in Uint8Array.prototype)
Uint8Array.prototype.slice = Uint8Array.prototype.subarray;
Estoy trabajando con objetos ArrayBuffer
, y me gustaría duplicarlos. Si bien esto es bastante fácil con punteros reales y memcpy
, no pude encontrar una forma sencilla de hacerlo en Javascript.
En este momento, así es como copio mis ArrayBuffers
:
function copy(buffer)
{
var bytes = new Uint8Array(buffer);
var output = new ArrayBuffer(buffer.byteLength);
var outputBytes = new Uint8Array(output);
for (var i = 0; i < bytes.length; i++)
outputBytes[i] = bytes[i];
return output;
}
¿Hay una manera más bonita?
Parece que simplemente pasar en la vista de datos de origen realiza una copia:
var a = new Uint8Array([2,3,4,5]);
var b = new Uint8Array(a);
a[0] = 6;
console.log(a); // [6, 3, 4, 5]
console.log(b); // [2, 3, 4, 5]
Probado en FF 33 y Chrome 36.
Prefiero el siguiente método
function copy(src) {
var dst = new ArrayBuffer(src.byteLength);
new Uint8Array(dst).set(new Uint8Array(src));
return dst;
}
Se supone que ArrayBuffer
es compatible con slice
(http://www.khronos.org/registry/typedarray/specs/latest/) para que pueda probar,
buffer.slice(0);
que funciona en Chrome 18 pero no en Firefox 10 o 11. En cuanto a Firefox, debe copiarlo manualmente. Puede aplicar un parche a la slice()
en Firefox porque la slice()
Chrome slice()
superará a la copia manual. Esto se vería algo así como,
if (!ArrayBuffer.prototype.slice)
ArrayBuffer.prototype.slice = function (start, end) {
var that = new Uint8Array(this);
if (end == undefined) end = that.length;
var result = new ArrayBuffer(end - start);
var resultArray = new Uint8Array(result);
for (var i = 0; i < resultArray.length; i++)
resultArray[i] = that[i + start];
return result;
}
Entonces puedes llamar,
buffer.slice(0);
para copiar la matriz tanto en Chrome como en Firefox.
Versión más rápida y un poco más complicada de la respuesta de Chuckj. Debería usar ~ 8x menos operaciones de copia en matrices con escritura grandes. Básicamente, copiamos tantos trozos de 8 bytes como sea posible y luego copiamos los 0-7 bytes restantes. Esto es especialmente útil en la versión actual de IE, ya que no tiene el método de división implementado para ArrayBuffer.
if (!ArrayBuffer.prototype.slice)
ArrayBuffer.prototype.slice = function (start, end) {
if (end == undefined) end = that.length;
var length = end - start;
var lengthDouble = Math.floor(length / Float64Array.BYTES_PER_ELEMENT);
// ArrayBuffer that will be returned
var result = new ArrayBuffer(length);
var that = new Float64Array(this, start, lengthDouble)
var resultArray = new Float64Array(result, 0, lengthDouble);
for (var i = 0; i < resultArray.length; i++)
resultArray[i] = that[i];
// copying over the remaining bytes
that = new Uint8Array(this, start + lengthDouble * Float64Array.BYTES_PER_ELEMENT)
resultArray = new Uint8Array(result, lengthDouble * Float64Array.BYTES_PER_ELEMENT);
for (var i = 0; i < resultArray.length; i++)
resultArray[i] = that[i];
return result;
}