2016-12-12 6 views
6

के लिए Chrome में काम नहीं कर रहा है मुझे कुछ जावास्क्रिप्ट कोड मिला है और मैं वास्तव में जावास्क्रिप्ट विशेषज्ञ नहीं हूं।hasOwnProperty() सरणी

हमारे पास एक ऑब्जेक्ट है जो buckets नामक हैंश और मानों के संग्रह की तरह कार्य करता है। इसमें गुण हैं जो हैश मान हैं और प्रत्येक संपत्ति एक वस्तु है। यहां बताया गया है कि वह ब्राउज़र की डीबगर में की तरह लग रहा है:

enter image description here

हम एक containsKey() समारोह hasOwnProperty() का उपयोग करता है में बाल्टी वस्तु एक हैश के होने की जाँच करने के लिए है।

containsKey: function(key) { 
    var hash = this.comparer.getObjectHashCode(key); 
    if (!this.buckets.hasOwnProperty(hash)) 
     return false; 

    var array = this.buckets[hash]; 
    for (var i = 0; i < array.length; i++) { 
     if (this.comparer.areEqual(array[i].key, key)) 
      return true; 
    } 
    return false; 
} 

यह कोड कम से कम 3 वर्षों तक बेकार ढंग से काम करता है। पिछले हफ्ते या दो में यह क्रोम में काम करना बंद कर दिया। अभी भी आईई में ठीक काम करता है (एफएफ के बारे में निश्चित नहीं है)।

ऐसा लगता है कि इसे काम करना जारी रखना चाहिए। मैंने सत्यापित किया है कि buckets में हैश संपत्ति की खोज की जा रही है। लेकिन hasOwnProperty() अब झूठी वापसी कर रहा है।

क्या यहां कोई और उचित कार्य है जिसका उपयोग मुझे करना चाहिए?

यहाँ जहां यह डिबगर में असफल रहा है:

enter image description here

+0

यह किस तरह से काम नहीं करता है? क्या कंसोल में त्रुटियों की सूचना दी गई है? आप कैसे जानते हैं कि समस्या यह है कि '.hasOwnProperty() 'कैसे काम करता है? – Pointy

+0

कृपया कोड जोड़ें, यहां या jsfiddle ... –

+0

जैसा कि मैंने इस सवाल में लिखा था: "मैंने सत्यापित किया है कि बाल्टी में हैश संपत्ति की खोज की जा रही है। लेकिन 'हैऑनप्रोपर्टी()' अब झूठी लौट रही है।" इस तरह मैं जानता हूं कि समस्या 'हैऑनप्रोपर्टी() 'के साथ है। मुझे कौन सा कोड जोड़ना चाहिए?यह प्रासंगिक कार्य है। संपूर्ण कोड बेस 53 के लाइनों है। – Pete

उत्तर

6

वहाँ प्रकट होता है क्रोम में बग है कि जब हम दिसंबर को 55.0.2883.75 लिए क्रोम संस्करण 54.0.2840.99 से उन्नत बनाया पेश किया गया था किसी प्रकार का होना करने के लिए 2, 2016.

हमारे विशेष मुद्दे का समाधान हमारे हैश फ़ंक्शन को केवल सकारात्मक संख्याओं को वापस करने के लिए बदलना था। जबकि ऋणात्मक संख्याओं का उपयोग करने वाले छोटे परीक्षण ठीक काम करते हैं (टिप्पणियों में स्क्विंट के उदाहरण के अनुसार), हमारे आवेदन में वे अब क्रोम में काम नहीं करते हैं।

मेरे पास इसमें खोदने के लिए बहुत समय नहीं है। मुझे नहीं पता कि इसे वस्तुओं की संख्या के साथ क्या करना है (हमारे पास केवल "बाल्टी" में लगभग 170 या इससे अधिक आइटम हैं)।

अद्यतन:

gre_gor, एक टिप्पणी में ऊपर एक नमूना है कि बग को दर्शाता है का उत्पादन किया:

obj = { 
    buckets: {}, 
    comparer: { 
    getObjectHashCode: function(str) { // hardcoded magic hashing 
     return { 
     "SUPPLYINVENTORY/SUPTRANSENTRY": -1525029354, 
     "PROPANE/LOADPROPANETOGROWERAR": 115289505 
     }[str.toUpperCase()]; 
    }, 
    areEqual: function(a, b) { 
     return a.toUpperCase() == b.toUpperCase(); 
    } 
    }, 
    containsKey: function(key) { 
    var hash = this.comparer.getObjectHashCode(key); 
    if (!this.buckets.hasOwnProperty(hash)) 
     return false; 

    var array = this.buckets[hash]; 
    for (var i = 0; i < array.length; i++) { 
     if (this.comparer.areEqual(array[i].key, key)) 
     return true; 
    } 
    return false; 
    } 
}; 
obj.buckets[-1525029354] = [{ 
    key: "SUPPLYINVENTORY/SUPTRANSENTRY", 
    value: "$SupTransEntry object" 
}]; 
obj.buckets[115289505] = [{ 
    key: "PROPANE/LOADPROPANETOGROWERAR", 
    value: "$LoadPropaneToGrowerAR object" 
}]; 
console.log(obj.containsKey("SUPPLYINVENTORY/SUPTRANSENTRY"), obj.containsKey("PROPANE/LOADPROPANETOGROWERAR")); 

पाठ "सच सच" कंसोल के पास जाना चाहिए, लेकिन क्रोम 55 में, यह "झूठी सच" पैदा करता है।

धन्यवाद परीक्षण के लिए gre_gor धन्यवाद जो इस मुद्दे को विश्वसनीय रूप से पुन: उत्पन्न करता है। मैंने Google को बग की सूचना दी है।

अद्यतन # 2: इसके लिए मेरे सबमिशन से 3 दिन पहले एक बग सबमिट किया गया था। मुद्दा तय कर दिया गया है और जल्द ही बाहर हो जाएगा कि मुझे इसके आसपास काम नहीं करना पड़ेगा। - Chromium Bug #673008

+3

मैंने mscorlib.js में hasOwnProperty (हैश) कोऑनप्रॉपर्टी (हैश.तोस्ट्रिंग()) में बदलकर इस पर काम किया है। यह कुछ स्थानों में देखा जाता है। –

संबंधित मुद्दे