tslint / codelyzer / ng लिंट की त्रुटि: "for ... (में ...) स्टेटमेंट को एक स्टेटमेंट के साथ फ़िल्टर किया जाना चाहिए"


229

एक प्रकार का त्रुटि संदेश:

src / ऐप / डिटेल / एडिट / edit.component.ts [111, 5]: for (... में ...) स्टेटमेंट्स को एक if स्टेटमेंट के साथ फ़िल्टर किया जाना चाहिए

कोड स्निपेट (यह एक काम करने वाला कोड है। यह angular.io फॉर्म सत्यापन अनुभाग पर भी उपलब्ध है ):

for (const field in this.formErrors) {
      // clear previous error message (if any)
      this.formErrors[field] = '';
      const control = form.get(field);

      if (control && control.dirty && !control.valid) {
        const messages = this.validationMessages[field];
        for (const key in control.errors) {
          this.formErrors[field] += messages[key] + ' ';
        }
      }
    }

किसी भी विचार कैसे इस एक प्रकार का वृक्ष त्रुटि को ठीक करने के लिए?


शायद एक उत्तर स्वीकार करें?
क्वर्टी

जवाबों:


241

वास्तविक समस्या की व्याख्या करने के लिए जो tslint इंगित कर रहा है, के लिए जावास्क्रिप्ट प्रलेखन से एक उद्धरण ... बयान में :

लूप स्वयं वस्तु के सभी प्रगणनीय गुणों पर आधारित होगा और वे वस्तुएं इसके निर्माता के प्रोटोटाइप (इन-प्रॉपर्टी चेन में ऑब्जेक्ट के करीब स्थित प्रोटोपोट्स प्रॉपर्टीज) से विरासत में मिली हैं।

तो, मूल रूप से इसका मतलब है कि आपको ऐसे गुण मिलेंगे जिनकी आपको (ऑब्जेक्ट की प्रोटोटाइप श्रृंखला से) मिलने की उम्मीद नहीं है।

इसे हल करने के लिए हमें केवल वस्तुओं के गुणों पर चलना चाहिए। हम इसे दो अलग-अलग तरीकों से कर सकते हैं (जैसा कि @Maxxx और @Qwertiy द्वारा सुझाया गया है)।

पहला उपाय

for (const field of Object.keys(this.formErrors)) {
    ...
}

यहाँ हम Object.Keys () विधि का उपयोग करते हैं, जो किसी दिए गए ऑब्जेक्ट के स्वयं के गुणों की एक सरणी देता है, उसी क्रम में जो एक के लिए प्रदान की जाती है ... लूप में (अंतर यह है कि फॉर-इन लूप गुणों को एन्यूमरेट करता है) प्रोटोटाइप श्रृंखला के रूप में अच्छी तरह से)।

दूसरा उपाय

for (var field in this.formErrors) {
    if (this.formErrors.hasOwnProperty(field)) {
        ...
    }
}

इस समाधान में हम ऑब्जेक्ट की सभी संपत्तियों को इसमें शामिल करते हैं, जिनमें यह प्रोटोटाइप चेन है, लेकिन Object.prototype.hasOwnProperty () विधि का उपयोग करते हैं , जो एक बूलियन को इंगित करता है कि क्या ऑब्जेक्ट के पास निर्दिष्ट संपत्ति है (विरासत में मिली नहीं) संपत्ति, फ़िल्टर करने के लिए विरासत में मिले गुण।


2
मुझे लगता है कि Object.keysES5 है नोटिस करना चाहते हैं । ES6 से केवल एक चीज लूप के लिए है। हम 0 से इसकी लंबाई तक सामान्य लूप में सरणी को पुन: व्यवस्थित कर सकते हैं और यह ES5 होगा।
Qwertiy

4
एक बार और नोटिस: यदि किसी तरह this.formErrorsअशक्त है, तो for...inबस कुछ भी नहीं करना है, जबकि for ... of Object.keys()त्रुटि फेंकना होगा।
user3448806 6

मैं दूसरे समाधान का पालन कर रहा हूं, लेकिन फिर भी मैं एक प्रकार का संदेश देख रहा हूं। कुछ समय के लिए विकलांग लिंट।
raj240

2
आप अनुशंसा क्यों नहीं करते Object.keys(obj).forEach( key => {...}) ?
बेन कार्प

268

@ हेलज़गेट के उत्तर को लागू करने का एक तरीका यह है कि आप अपने 'को ..' के साथ बदल दें

for (const field of Object.keys(this.formErrors)) {

6
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह न केवल समस्या को हल करता है, बल्कि अतिरिक्त सशर्त जैसे कि तुलना में बॉयलरप्लेट कोड की मात्रा को भी कम करता है if (this.formErrors.hasOwnProperty(field))
डेनियलोस

1
उत्तर से सावधान रहें, यह आपके कोड तोड़ सकता है। आप इसे "ठीक" करने के बाद परीक्षण करें।
ZZZ

3
यह वास्तव में मेरे लिए tslint त्रुटि को दूर नहीं करता है।
HammerN'Songs

7
@ HammerN'Songs जाँच लें कि आप के लिए करने के लिए बदल के लिए के बजाय में
टॉम

यहां भी यही समस्या। इस का उपयोग करने के बाद त्रुटि को दूर नहीं किया जाता है
लामेलर

71
for (const field in this.formErrors) {
  if (this.formErrors.hasOwnProperty(field)) {
for (const key in control.errors) {
  if (control.errors.hasOwnProperty(key)) {

13

Object.keys का उपयोग करें:

Object.keys(this.formErrors).map(key => {
  this.formErrors[key] = '';
  const control = form.get(key);

  if(control && control.dirty && !control.valid) {
    const messages = this.validationMessages[key];
    Object.keys(control.errors).map(key2 => {
      this.formErrors[key] += messages[key2] + ' ';
    });
  }
});

2

यदि आपके उद्देश्यों के लिए (... में ...) का व्यवहार स्वीकार्य / आवश्यक है, तो आप इसे अनुमति देने के लिए tslint बता सकते हैं।

tslint.json में, इसे "नियम" खंड में जोड़ें।

"forin": false

अन्यथा, @Maxxx के पास सही विचार है

for (const field of Object.keys(this.formErrors)) {

0

मुझे लगता है कि यह संदेश उपयोग करने से बचने के बारे में नहीं है switch। इसके बजाय यह आप के लिए जाँच करना चाहता है hasOwnProperty। पृष्ठभूमि यहां पढ़ी जा सकती है: https://stackoverflow.com/a/16735184/1374488

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.