Bien, estoy un poco perplejo. Probablemente me falta algo descaradamente obvio, pero aparentemente no puedo ver el bosque para los árboles:Cómo crear una matriz de JavaScript "real" en Rhino
Estoy tratando de llamar a una función de JavaScript que espera que su parámetro sea una matriz, es decir, comprueba if (arg instanceof Array)...
Desafortunadamente, yo (o Rhino) parece que no puede crear una gama tan amplia:
Context cx = Context.enter();
Scriptable scope = cx.initStandardObjects();
String src = "function f(a) { return a instanceof Array; };";
cx.evaluateString(scope, src, "<src>", 0, null);
Function f = (Function) scope.get("f", scope);
Object[] fArgs = new Object[]{ new NativeArray(0) };
Object result = f.call(cx, scope, scope, fArgs);
System.out.println(Context.toString(result));
Context.exit();
Y por desgracia, es result
false
.
¿Qué me falta aquí?
Editar:
Sólo un poco más de información: tanto [] instanceof Array
y new Array() instanceof Array
retorno true
como cabría esperar. Si agrego elementos a la matriz que aparecen en el código JavaScript con los índices correctos (numéricos, a partir de cero):
NativeArray a = new NativeArray(new Object[]{ 42, "foo" });
Cuando la salida de usar esta función JavaScript:
function f(a) {
var result = [];
result.push(typeof a);
for (var i in a) {
result.push(i + ' => ' + a[i]);
}
return result.join('\\n');
}
El resultado es :
object
0 => 42
1 => foo
Así que funciona. Excepto que yo quiero una matriz 'real' :)
¿Es posible añadir algunas diagnistics af() para averiguar cuál es el argumento que obtienes en realidad? – djna
Agregué cierta información, tal vez eso ayuda – n3rd
El control que está haciendo la biblioteca ('a instanceof Array') es razonable, pero limitado. Por ejemplo, incluso sin Rhino, no podría identificar una matriz en una aplicación basada en navegador si esa matriz se originó en otra ventana. ¿Intentarías agregar 'result.push (Object.prototype.toString.call (a));' a tu función? Será interesante ver si dice '[object Object]' or '[object Array]'. Este último sería similar a un arreglo de otra ventana, el primero indicaría que 'NativeArray' no era exactamente lo que su nombre implica. –