2016-12-25 18 views
2

我正在實現節點的本地模塊,並試圖返回看起來像一個數組,但由本機數據支持的東西。目前我創建一個ObjectTemplate並使用SetIndexedPropertyHandler,所以我可以處理從JS獲取索引的嘗試。這一切都有效,但從JS看起來只是一個Object而不是一個Array。有什麼辦法可以讓這看起來更像一個數組?如何從節點插件返回看起來像數組的東西?

回答

1

您可以返回Object.entries(object)

Object.entries()方法返回給定 對象自己的可枚舉的屬性[key, value]對陣列,在同樣的 順序作爲由for...in環路提供(不同之處在於一個 for-in環枚舉在原型側鏈性質以及)。

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中有一個例子。

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也是完全有效的。

相關問題