दिलचस्प पोस्ट
जेएसन के लिए एमवीसी 4 विधानसभा संदर्भ लापता। एन्कोड सी कोड को एक आलेख स्वचालित रूप से एक ग्राफ बनाना पंक्तियां / संयोजन पंक्तियों को मिलाएं अनचेक किए गए रनटाइम.लिस्ट ऐबूट करते हुए टैब। ExecuteScript चला रहे हैं? विभिन्न फ़ोल्डर से फ़ाइलें आयात करना रेज़र व्यू में इमेज और डिस्प्ले में कन्वर्ट बाइट ऐरे आईडी और कक्षा के बारे में सीएसएस बेस्ट प्रैक्टिस? सॉर्ट किए गए और घुमाए गए सरणी में खोजना सरणी के क्रमबद्धन सभी विशेष वर्णों की सूची जिसे एक रीजेक्स में बचने की आवश्यकता है जावास्क्रिप्ट में कार्यों को अधिभार कैसे करें? स्थिरांक के लिए सी # नामकरण सम्मेलन? दिए गए यूआरएल के लिए आरएसएस फ़ीड की खोज कैसे करें दृश्य स्टूडियो SignTool.exe नहीं मिला एएसपी.नेट बाधाओं की पहचान करने के लिए कौन से पेर्फमैन काउंटर उपयोगी हैं?

सरणी परिवर्तन के लिए कैसे देखें?

जावास्क्रिप्ट में, क्या सूचित किया जा सकता है कि पुश, पॉप, शिफ्ट या इंडेक्स आधारित असाइनमेंट का उपयोग करते समय एक सरणी संशोधित होती है? मुझे कुछ ऐसा चाहिए जो एक ऐसी घटना को आग लगाएगा जिसे मैं संभाल सकता हूं

मुझे स्पाइडरमॉकी में वॉच () की कार्यक्षमता के बारे में पता है, लेकिन यह केवल तभी काम करता है जब पूरे चर को कुछ और पर सेट किया जाता है

Solutions Collecting From Web of "सरणी परिवर्तन के लिए कैसे देखें?"

कुछ विकल्प हैं …

1. धक्का विधि को ओवरराइड करें

त्वरित और गंदे रास्ते जा रहे हैं, आप अपने सरणी के लिए push() विधि को ओवरराइड कर सकते हैं 1 :

 Object.defineProperty(myArray, "push", { configurable: false, enumerable: false, // hide from for...in writable: false, value: function () { for (var i = 0, n = this.length, l = arguments.length; i < l; i++, n++) { RaiseMyEvent(this, n, this[n] = arguments[i]); // assign/raise your event } return n; } }); 

1 वैकल्पिक रूप से, आप Array.prototype.push() को ओवरराइड कर सकते हैं … हालांकि, Array.prototype साथ Array.prototype करना आम तौर पर बीमार-सलाह है। फिर भी, अगर आप ऐसा करना चाहते हैं, तो Array.prototype को Array.prototype साथ Array.prototypeArray.prototype

अब, यह सिर्फ एक तरीका है और सरणी सामग्री को बदलने के कई तरीके हैं हमें शायद कुछ अधिक व्यापक की आवश्यकता है …

2. एक कस्टम अवलोकन करने योग्य सरणी बनाएँ

ओवरराइड करने के तरीकों के बजाय, आप अपना खुद का अवलोकन करने योग्य सरणी बना सकते हैं यह विशेष रूप से कार्यान्वयन एक सरणी को एक नए सरणी-प्रकार के ऑब्जेक्ट में कॉपी करता है और कस्टम push() , pop() , shift() , unshift() , slice() , और splice() विधियों के साथ-साथ कस्टम इंडेक्स unshift() प्रदान करता है (बशर्ते कि सरणी का आकार केवल उपर्युक्त विधियों या length संपत्ति के माध्यम से संशोधित होता है)।

 function ObservableArray(items) { var _self = this, _array = [], _handlers = { itemadded: [], itemremoved: [], itemset: [] }; function defineIndexProperty(index) { if (!(index in _self)) { Object.defineProperty(_self, index, { configurable: true, enumerable: true, get: function() { return _array[index]; }, set: function(v) { _array[index] = v; raiseEvent({ type: "itemset", index: index, item: v }); } }); } } function raiseEvent(event) { _handlers[event.type].forEach(function(h) { h.call(_self, event); }); } Object.defineProperty(_self, "addEventListener", { configurable: false, enumerable: false, writable: false, value: function(eventName, handler) { eventName = ("" + eventName).toLowerCase(); if (!(eventName in _handlers)) throw new Error("Invalid event name."); if (typeof handler !== "function") throw new Error("Invalid handler."); _handlers[eventName].push(handler); } }); Object.defineProperty(_self, "removeEventListener", { configurable: false, enumerable: false, writable: false, value: function(eventName, handler) { eventName = ("" + eventName).toLowerCase(); if (!(eventName in _handlers)) throw new Error("Invalid event name."); if (typeof handler !== "function") throw new Error("Invalid handler."); var h = _handlers[eventName]; var ln = h.length; while (--ln >= 0) { if (h[ln] === handler) { h.splice(ln, 1); } } } }); Object.defineProperty(_self, "push", { configurable: false, enumerable: false, writable: false, value: function() { var index; for (var i = 0, ln = arguments.length; i < ln; i++) { index = _array.length; _array.push(arguments[i]); defineIndexProperty(index); raiseEvent({ type: "itemadded", index: index, item: arguments[i] }); } return _array.length; } }); Object.defineProperty(_self, "pop", { configurable: false, enumerable: false, writable: false, value: function() { if (_array.length > -1) { var index = _array.length - 1, item = _array.pop(); delete _self[index]; raiseEvent({ type: "itemremoved", index: index, item: item }); return item; } } }); Object.defineProperty(_self, "unshift", { configurable: false, enumerable: false, writable: false, value: function() { for (var i = 0, ln = arguments.length; i < ln; i++) { _array.splice(i, 0, arguments[i]); defineIndexProperty(_array.length - 1); raiseEvent({ type: "itemadded", index: i, item: arguments[i] }); } for (; i < _array.length; i++) { raiseEvent({ type: "itemset", index: i, item: _array[i] }); } return _array.length; } }); Object.defineProperty(_self, "shift", { configurable: false, enumerable: false, writable: false, value: function() { if (_array.length > -1) { var item = _array.shift(); delete _self[_array.length]; raiseEvent({ type: "itemremoved", index: 0, item: item }); return item; } } }); Object.defineProperty(_self, "splice", { configurable: false, enumerable: false, writable: false, value: function(index, howMany /*, element1, element2, ... */ ) { var removed = [], item, pos; index = index == null ? 0 : index < 0 ? _array.length + index : index; howMany = howMany == null ? _array.length - index : howMany > 0 ? howMany : 0; while (howMany--) { item = _array.splice(index, 1)[0]; removed.push(item); delete _self[_array.length]; raiseEvent({ type: "itemremoved", index: index + removed.length - 1, item: item }); } for (var i = 2, ln = arguments.length; i < ln; i++) { _array.splice(index, 0, arguments[i]); defineIndexProperty(_array.length - 1); raiseEvent({ type: "itemadded", index: index, item: arguments[i] }); index++; } return removed; } }); Object.defineProperty(_self, "length", { configurable: false, enumerable: false, get: function() { return _array.length; }, set: function(value) { var n = Number(value); var length = _array.length; if (n % 1 === 0 && n >= 0) { if (n < length) { _self.splice(n); } else if (n > length) { _self.push.apply(_self, new Array(n - length)); } } else { throw new RangeError("Invalid array length"); } _array.length = n; return value; } }); Object.getOwnPropertyNames(Array.prototype).forEach(function(name) { if (!(name in _self)) { Object.defineProperty(_self, name, { configurable: false, enumerable: false, writable: false, value: Array.prototype[name] }); } }); if (items instanceof Array) { _self.push.apply(_self, items); } } (function testing() { var x = new ObservableArray(["a", "b", "c", "d"]); console.log("original array: %o", x.slice()); x.addEventListener("itemadded", function(e) { console.log("Added %o at index %d.", e.item, e.index); }); x.addEventListener("itemset", function(e) { console.log("Set index %d to %o.", e.index, e.item); }); x.addEventListener("itemremoved", function(e) { console.log("Removed %o at index %d.", e.item, e.index); }); console.log("popping and unshifting..."); x.unshift(x.pop()); console.log("updated array: %o", x.slice()); console.log("reversing array..."); console.log("updated array: %o", x.reverse().slice()); console.log("splicing..."); x.splice(1, 2, "x"); console.log("setting index 2..."); x[2] = "foo"; console.log("setting length to 10..."); x.length = 10; console.log("updated array: %o", x.slice()); console.log("setting length to 2..."); x.length = 2; console.log("extracting first element via shift()"); x.shift(); console.log("updated array: %o", x.slice()); })(); 

मुझे निम्नलिखित पाया जो इसे पूरा कर रहा है: https://github.com/mennovanslooten/Observable-Arrays

अवलोकन -अरेज़ अंडरस्कोर फैलाते हैं और इसका अनुसरण किया जा सकता है: (उस पृष्ठ से)

 // For example, take any array: var a = ['zero', 'one', 'two', 'trhee']; // Add a generic observer function to that array: _.observe(a, function() { alert('something happened'); }); 

यहां सभी उत्तरों पढ़ने से, मैंने एक सरल समाधान इकट्ठा किया है जिसके लिए किसी बाहरी पुस्तकालयों की आवश्यकता नहीं है।

यह दृष्टिकोण के सामान्य विचार को भी बेहतर बताता है:

 function processQ() { // ... this will be called on each .push } var myEventsQ = []; myEventsQ.push = function() { Array.prototype.push.apply(this, arguments); processQ();}; 
 if (!Array.prototype.forEach) { Object.defineProperty(Array.prototype, 'forEach', { enumerable: false, value: function(callback) { for(var index = 0; index != this.length; index++) { callback(this[index], index, this); } } }); } if(Object.observe) { Object.defineProperty(Array.prototype, 'Observe', { set: function(callback) { Object.observe(this, function(changes) { changes.forEach(function(change) { if(change.type == 'update') { callback(); } }); }); } }); } else { Object.defineProperties(Array.prototype, { onchange: { enumerable: false, writable: true, value: function() { } }, Observe: { set: function(callback) { Object.defineProperty(this, 'onchange', { enumerable: false, writable: true, value: callback }); } } }); var names = ['push', 'pop', 'reverse', 'shift', 'unshift']; names.forEach(function(name) { if(!(name in Array.prototype)) { return; } var pointer = Array.prototype[name]; Array.prototype[name] = function() { pointer.apply(this, arguments); this.onchange(); } }); } var a = [1, 2, 3]; a.Observe = function() { console.log("Array changed!"); }; a.push(8); 

एक दिलचस्प संग्रह पुस्तकालय https://github.com/mgesmundo/smart-collection है । आपको सरणियों को देखने और उनके साथ विचारों को भी जोड़ने की अनुमति देता है प्रदर्शन के बारे में निश्चित नहीं है क्योंकि मैं इसे खुद का परीक्षण कर रहा हूं इस पोस्ट को जल्द ही अपडेट कर देंगे।

मैं आपको देशी प्रोटोटाइप का विस्तार करने की सलाह नहीं देता इसके बजाय, आप नई सूची की तरह एक पुस्तकालय का उपयोग कर सकते हैं; https://github.com/azer/new-list

यह एक मूल जावास्क्रिप्ट सरणी बनाता है और आपको किसी भी परिवर्तन की सदस्यता लेने देता है। यह अद्यतन बैचों और आपको अंतिम अंतर देता है;

 List = require('new-list') todo = List('Buy milk', 'Take shower') todo.pop() todo.push('Cook Dinner') todo.splice(0, 1, 'Buy Milk And Bread') todo.subscribe(function(update){ // or todo.subscribe.once update.add // => { 0: 'Buy Milk And Bread', 1: 'Cook Dinner' } update.remove // => [0, 1] })