2015-12-21 2 views
0

Цель - отслеживать изменения массива (в зависимости от длины).Длина массива дорожек js

я нашел решение одной части, и я нахожусь в беде с второй:

var arr = Object.create([]) 
 
    , _length = 0 
 
    ; 
 

 
Object.defineProperty(arr, 'length', { 
 
    enumerable: true, 
 
    get: function() { 
 
     return _length; 
 
    }, 
 
    set: function (length) { 
 
     //TODO: you can compare and do some action here 
 
     _length = length; 
 
    } 
 
});

может быть, это было бы полезно для вас, так как это будет отслеживать все изменения, внесенные для обр, с использованием методов Array (толчок, поп, смещение ...)

но вот я пришел ко второй части: если вы используете индекс присвоить некоторые значения, как

arr[0] = 1;

это не будет работать: длина оставаться же, и трекинг не работает = (

так может кто-нибудь мне помочь?

добавил: нормально, MDN говорит нам:

При установке свойства в массиве JavaScript, когда свойство является допустимым индексом массива и индекс выходит за пределами текущих пределов массива, двигатель обновит свойство длины массива соответственно

Кто-нибудь знает, как это происходит ???

Я чувствую, что этот вновь созданный arr должен быть экземпляром массива, поэтому мне кажется, что я должен сделать что-то вроде this.

добавлен x2:

var _length = 0 
 
    , arr = Object.create(Array.prototype, { 
 
\t \t length: { 
 
\t \t \t enumerable: true, 
 
\t \t \t get: function() { 
 
\t \t \t \t return _length; 
 
\t \t \t }, 
 
\t \t \t set: function (length) { 
 
\t \t \t \t console.log('[debug] newLength/oldLength: ', length+'/'+_length); 
 
\t \t \t \t _length = length; 
 
\t \t \t } 
 
\t \t } 
 
\t }) 
 
    ;

Теперь обр является экземпляром Array (обр InstanceOf Array -> истина), но по-прежнему обр [0] = 1 не будет вызывать длину сеттер = (

+0

КСТАТИ: Array.isArray (arr) вернет false (очевидно), но для моего случая это нормально. –

+1

Я пытаюсь понять, какова ваша фактическая цель? Возможно, вы могли бы объяснить немного дальше? – Xotic750

+0

Ваш запрос должен быть функцией длины массива, о котором вам нужно знать, нет решения, которое инкапсулирует нужные вам функции. –

ответ

0

вы можете посмотреть на this question

Это объясняет несколько вариантов, которые вы могли бы быть в том

# 2 кажется хорошим кандидатом на то, что вы ищете.

+0

нет, там, когда он делает «x [2] = 'Foo';» x уже определили свойство «2» для объекта «x» и отслеживают его. Мой интерес - отслеживать, был ли добавлен элемент (ранее такого индекса не было) + обновленный оригинальный пост в любом случае - спасибо =) –

+0

@AndrewKazman, если ни один из этих ответов не работает для вас, вам придется подождать технологии чтобы продвинуться достаточно далеко, чтобы заставить его работать. Вы определенно можете надеяться на это :), но на данный момент вы могли бы также рассказать о чем-то другом. –

0

Если вы хотите повеселиться, есть spec for observables objects/arrays или вы можете использовать underscore/lodash (они взаимозаменяемы) и расширение: https://github.com/mennovanslooten/underscore-observe Это простой в использовании:

_.observe(some_array, function(new_array, old_array) { /* called for every change */ }); 
+0

Оба, подчеркивание и lodash, наблюдаются на основе setInterval (timeout ~ 250, как я помню) - это не очень хорошая опция (+ на самом деле просто сделать наблюдателя на основе setInterval без каких-либо дополнительных libs) –

+0

Он не использует setInterval больше, он переопределяет встроенные методы массива, [источник кода здесь] (https://github.com/mennovanslooten/underscore-observe). – Shanoor

+0

https://github.com/mennovanslooten/underscore-observe/blob/master/underscore-observe.js#L326 - похоже, у них такая же проблема, как и у i: все работает, пока вы не назначаете значение с использованием индекса –

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