2016-12-25 1 views
2

Я реализую собственный модуль для узла и пытаюсь вернуть что-то, что похоже на массив, но поддерживается встроенными данными. На данный момент я создаю ObjectTemplate и используя SetIndexedPropertyHandler, поэтому я могу обрабатывать попытки получить индексы от JS. Все это работает, но из JS это выглядит как объект, а не массив. Есть ли способ сделать это больше похожим на массив?Как я могу вернуть что-то, что похоже на массив из аддона узла?

ответ

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) вместо ObjectTemplate. Пример: this 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 

Это также отлично действует до прототипически наследовать от Array в JavaScript.

Смежные вопросы