NgFor लूप का उपयोग करके पुनरावृति कैसे करें मैप स्ट्रिंग के रूप में कुंजी और मान के रूप में मैप करें


109

मैं कोणीय 5 में नया हूं और टाइपस्क्रिप्ट में दूसरे मानचित्र वाले नक्शे को पुनरावृत्त करने की कोशिश कर रहा हूं। नीचे दिए गए कोणीय में इस तरह के नक्शे के नीचे पुनरावृति कैसे घटक के लिए कोड है:

import { Component, OnInit} from '@angular/core';

@Component({
  selector: 'app-map',
  templateUrl: './map.component.html',
  styleUrls: ['./map.component.css']
})
export class MapComponent implements OnInit {
  map = new Map<String, Map<String,String>>();
  map1 = new Map<String, String>();

  constructor() { 


  }

  ngOnInit() {
    this.map1.set("sss","sss");
    this.map1.set("aaa","sss");
    this.map1.set("sass","sss");
    this.map1.set("xxx","sss");
    this.map1.set("ss","sss");


    this.map1.forEach((value: string, key: string) => {
      console.log(key, value);

    });


    this.map.set("yoyoy",this.map1);

  }



}

और इसका टेम्पलेट HTML है:

<ul>
  <li *ngFor="let recipient of map.keys()">
    {{recipient}}
   </li>


</ul>

<div>{{map.size}}</div>

रनटाइम त्रुटि



क्या उपाय है मैं न अपने नक्शे को सरणी में बदलना चाहता हूं
फिरोज सिद्दीकी


धन्यवाद बहुत अच्छी तरह से काम करता है
फिरोज सिद्दीकी

जवाबों:


246

कोणीय 6.1+ के लिए , आप डिफ़ॉल्ट पाइप का उपयोग कर सकते हैं keyvalue( समीक्षा भी करें और अपवोट भी करें ):

<ul>
    <li *ngFor="let recipient of map | keyvalue">
        {{recipient.key}} --> {{recipient.value}}
    </li>
</ul>

काम कर रहा डेमो


पिछले संस्करण के लिए:

इसका एक सरल उपाय है सरणी को मानचित्र में बदलना: Array.from

घटक पक्ष:

map = new Map<String, String>();

constructor(){
    this.map.set("sss","sss");
    this.map.set("aaa","sss");
    this.map.set("sass","sss");
    this.map.set("xxx","sss");
    this.map.set("ss","sss");
    this.map.forEach((value: string, key: string) => {
        console.log(key, value);
    });
}

getKeys(map){
    return Array.from(map.keys());
}

खाका पक्ष:

<ul>
  <li *ngFor="let recipient of getKeys(map)">
    {{recipient}}
   </li>
</ul>

काम कर रहा डेमो


1
अगर नक्शा = नया नक्शा <स्ट्रिंग, नक्शा <स्ट्रिंग, स्ट्रिंग >> (); यह कैसे काम करता है?
फिरोज सिद्दीकी

@FerozSiddiqui, मैंने उत्तर को अपडेट कर दिया है, और मुझे लगता है कि यह किसी भी नेस्टेड स्तर के लिए काम करेगा।
विवेक दोशी

अगर हम इसे Array में बदल देते हैं, तो हम सभी Map फ़ीचर खो देते हैं। मैप का लाभ क्या है?
diEcho

1
@ pro.mean, हम सिर्फ इसलिए परिवर्तित कर रहे हैं क्योंकि हम इसे कोणीय टेम्पलेट के माध्यम से लूप करना चाहते हैं क्योंकि यह पुनरावृति के लिए कुछ चलना चाहते हैं। और आपके पास अभी भी मूल वस्तु mapउपलब्ध है, जिसका उपयोग आप कर सकते हैं कि मानचित्र के सभी लाभ का उपयोग करने के लिए
विवेक दोशी

1
@ pro.mean, हमने केवल टेम्पलेट पक्ष पर यह दिखाने के लिए परिवर्तित किया है, लेकिन आपके पास अभी भी मैप obaject है जिसे आप अपने घटक पक्ष में उपयोग कर सकते हैं। आप ओपी से पूछ सकते हैं why he needed this kind of requirement, वह आपको बेहतर तरीके से समझा सकता है :)
विवेक दोषी

48

यदि आप Angular 6.1 या इसके बाद का उपयोग कर रहे हैं, तो KeyValuePipe का उपयोग करना सबसे सुविधाजनक तरीका है

   @Component({
      selector: 'keyvalue-pipe',
      template: `<span>
        <p>Object</p>
        <div *ngFor="let item of object | keyvalue">
          {{item.key}}:{{item.value}}
        </div>
        <p>Map</p>
        <div *ngFor="let item of map | keyvalue">
          {{item.key}}:{{item.value}}
        </div>
      </span>`
    })
    export class KeyValuePipeComponent {
      object: Record<number, string> = {2: 'foo', 1: 'bar'};
      map = new Map([[2, 'foo'], [1, 'bar']]);
    }

3
उम्मीद है कि लोग इस उत्तर को स्क्रॉल करेंगे और देखेंगे, क्योंकि मैं तब तक रिफ्लेक्टर करने वाला था जब तक मैंने इस प्रकार के आउट-ऑफ-द-बॉक्स पाइप को अपने mapप्रकार के लिए उपलब्ध नहीं देखा था, जो कि इसके साथ उपयोग करने का ध्यान रखता है*ngFor
atconway

2
ऐसा लगता है, कीवल्यू मानचित्र की प्रारंभिक छंटाई नहीं रखता है :-(, आपको इसे ठीक करने के लिए
तुलनात्मक

1
यह सच है। और यहाँ एक मुद्दा है github.com/angular/angular/issues/31420
Londeren

24

संपादित करें

कोणीय 6.1 और नए के लिए, लॉडरन द्वारा सुझाए अनुसार KeyValuePipe का उपयोग करें ।

कोणीय 6.0 और पुराने के लिए

चीजों को आसान बनाने के लिए, आप एक पाइप बना सकते हैं।

import {Pipe, PipeTransform} from '@angular/core';

@Pipe({name: 'getValues'})
export class GetValuesPipe implements PipeTransform {
    transform(map: Map<any, any>): any[] {
        let ret = [];

        map.forEach((val, key) => {
            ret.push({
                key: key,
                val: val
            });
        });

        return ret;
    }
}

 <li *ngFor="let recipient of map |getValues">

जैसा कि यह शुद्ध है, यह हर परिवर्तन का पता लगाने पर ट्रिगर नहीं किया जाएगा, लेकिन केवल अगर mapपरिवर्तन चर का संदर्भ

स्टैकब्लिट्ज़ डेमो


मुझे लगता है कि परिवर्तनों के लिए आपके पाइप की जाँच की जाएगी और क्या यह हर परिवर्तन का पता लगाने के चक्र पर पूर्ण चलना है क्योंकि यह "शुद्ध" नहीं है। वोट डाउन नहीं किया, लेकिन शायद इसीलिए?
ड्रेनै

5
@ रयान पाइप्स डिफ़ॉल्ट रूप से शुद्ध हैं। यदि आप पाइप में कंसोल.लॉग जोड़ते हैं, तो आप देखेंगे कि यह कई बार कॉल नहीं करता है। लेकिन स्वीकृत समाधान में घटक विधि ...
डेविड

1
मुझे वह पिछड़ा हुआ मिला! सिर के लिए धन्यवाद
Drenai

10

ऐसा इसलिए है क्योंकि map.keys()एक पुनरावृत्ति रिटर्न। *ngForपुनरावृत्तियों के साथ काम कर सकते हैं, लेकिन map.keys()हर परिवर्तन का पता लगाने के चक्र पर बुलाया जाएगा, इस प्रकार सरणी के लिए एक नया संदर्भ उत्पन्न होता है, जिसके परिणामस्वरूप त्रुटि दिखाई देती है। वैसे, यह हमेशा एक त्रुटि नहीं है क्योंकि आप पारंपरिक रूप से इसके बारे में सोचेंगे; यह आपकी किसी भी कार्यक्षमता को नहीं तोड़ सकता है, लेकिन यह बताता है कि आपके पास एक डेटा मॉडल है जो एक पागल तरीके से व्यवहार करता है - परिवर्तन डिटेक्टर की तुलना में तेजी से बदलते हुए इसके मूल्य की जांच करता है।

यदि आप अपने घटक में मानचित्र को किसी सरणी में बदलना नहीं चाहते हैं, तो आप टिप्पणियों में सुझाए गए पाइप का उपयोग कर सकते हैं। कोई अन्य समाधान नहीं है, जैसा कि लगता है।

पुनश्च यह त्रुटि उत्पादन मोड में नहीं दिखाई जाएगी, क्योंकि यह वास्तविक त्रुटि के बजाय एक बहुत सख्त चेतावनी की तरह है, लेकिन फिर भी, इसे छोड़ने का यह एक अच्छा विचार नहीं है।


1

जैसा कि लोगों ने टिप्पणियों में उल्लेख किया है किवैल्यू पाइप सम्मिलन के क्रम को बरकरार नहीं रखता है (जो कि मानचित्र का प्राथमिक उद्देश्य है)।

किसी भी तरह, ऐसा लगता है जैसे कि आपके पास एक मैप ऑब्जेक्ट है और ऑर्डर को संरक्षित करना चाहते हैं, ऐसा करने का सबसे साफ तरीका है प्रविष्टियां () फ़ंक्शन:

<ul>
    <li *ngFor="let item of map.entries()">
        <span>key: {{item[0]}}</span>
        <span>value: {{item[1]}}</span>
    </li>
</ul>

कृपया github.com/angular/angular/issues/31420#issuecomment-635377113 देखें कि आपको .entries () का उपयोग करने से क्यों बचना चाहिए
Florian

1

मानचित्र प्रविष्टि क्रम में प्रदर्शित करने के लिए नीचे दिया गया उपयोगी कोड ।

<ul>
    <li *ngFor="let recipient of map | keyvalue: asIsOrder">
        {{recipient.key}} --> {{recipient.value}}
    </li>
</ul>

.ts फ़ाइल नीचे कोड जोड़ें।

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