我正在为节点实现本机模块,并尝试返回看起来像数组但由本机数据支持的内容。目前我正在创建一个ObjectTemplate并使用SetIndexedPropertyHandler,因此我可以处理从JS获取索引的尝试。这一切都有效,但是从JS看起来它只是一个Object,而不是一个Array。有什么方法可以让它看起来像一个数组吗?
答案 0 :(得分:1)
您可以返回Object.entries(object)
。
Object.entries()
方法返回给定的数组 对象自己的可枚举属性[key, value]
对,同样 由for...in
循环提供的顺序(不同之处在于afor-in
循环也枚举了原型链中的属性。
const obj = {a:1, b:2, c:3};
console.log(Object.entries(obj));
答案 1 :(得分:1)
所有arraylike对象必须length
。只要他们拥有该属性,您就可以借用Array
个函数并在您的对象上运行它们(例如Array.prototype.forEach.call(obj, ...)
),或者在ES6上运行Array.from
:
obj = {
0: "foo",
1: "bar",
length: 2
};
// ES5 way to get a real array:
console.log(Array.prototype.slice.call(obj));
// ES6 way to get a real array:
console.log(Array.from(obj));
如果您确实想要返回一个数组而不是一个arraylike对象,那么我建议您使用array = Array::New()
和array->Set(index, element)
而不是ObjectTemplate
。 this question中有一个例子。
答案 2 :(得分:0)
您可以考虑在真实数组周围使用Proxy,使用与本机对象交互的陷阱/处理程序。使用代理会有性能损失(如果它是一个重要的热门代码路径,请不要尝试迭代代理阵列),但它们可以让您做任何事情。
var _arr = [];
var arraylike = new Proxy(_arr, {
get: function (target, prop) {
// Interface with your native object here.
if (prop === "length") return 20;
return "hello";
}
});
// Consume
> arraylike.length
20
> arraylike[5]
"hello"
> arraylike instanceof Array
true
> Array.isArray(arraylike)
true
在javascript中原型继承Array
也非常有效。