如何从节点插件返回看起来像数组的内容?

时间:2016-12-25 20:14:37

标签: javascript node.js node.js-addon

我正在为节点实现本机模块,并尝试返回看起来像数组但由本机数据支持的内容。目前我正在创建一个ObjectTemplate并使用SetIndexedPropertyHandler,因此我可以处理从JS获取索引的尝试。这一切都有效,但是从JS看起来它只是一个Object,而不是一个Array。有什么方法可以让它看起来像一个数组吗?

3 个答案:

答案 0 :(得分:1)

您可以返回Object.entries(object)

  

Object.entries()方法返回给定的数组   对象自己的可枚举属性[key, value]对,同样   由for...in循环提供的顺序(不同之处在于a   for-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)而不是ObjectTemplatethis 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也非常有效。