เข้าถึงคีย์และค่าของวัตถุโดยใช้ * ngFor


426

ฉันสับสนเล็กน้อยเกี่ยวกับวิธีรับkeyและvalueวัตถุใน angular2 ในขณะที่ใช้*ngForเพื่อวนวัตถุ ฉันรู้ในเชิงมุม 1.x มีไวยากรณ์เหมือนกัน

ng-repeat="(key, value) in demo"

แต่ฉันไม่รู้วิธีการทำเช่นเดียวกันใน angular2 ฉันลองทำสิ่งที่คล้ายกันโดยไม่ประสบความสำเร็จ:

<ul>
  <li *ngFor='#key of demo'>{{key}}</li>
</ul>

demo = {
    'key1': [{'key11':'value11'}, {'key12':'value12'}],
    'key2': [{'key21':'value21'}, {'key22':'value22'}],
  }

นี่คือ plnkr ด้วยความพยายามของฉัน: http://plnkr.co/edit/mIj619FncOpfdwrR0KeG?p=preview

ฉันจะรับkey1และkey2ใช้แบบไดนามิกได้*ngForอย่างไร หลังจากค้นหาอย่างครอบคลุมฉันพบความคิดในการใช้ท่อ แต่ฉันไม่รู้ว่าจะทำยังไง มีท่อแบบ inbuilt สำหรับทำแบบเดียวกันใน angular2 หรือไม่?


2
ขณะนี้ยังไม่มีการสนับสนุนkey, valueไวยากรณ์ของคู่ใน angular2 ngForคุณควรดูคำตอบนี้
Pankaj Parkar

@PankajParkar ใช่แล้วอ่านคำตอบนี้ ทางเลือกอื่นสำหรับตอนนี้?
Pardeep Jain

@Pradeep ฉันไม่คิดว่าจะมีวิธีอื่นอีกแล้วตอนนี้คุณควรจะสร้างของตัวเองPipeสำหรับสิ่งนี้ ..
Pankaj Parkar

อืม แต่ฉันไม่รู้ว่าจะสร้างไพพ์ได้อย่างไร
Pardeep Jain

@ คำตอบที่ดีที่ฉันให้คุณสำหรับการอ้างอิงมีการใช้งานที่ พวกเขาควรทำงาน ..
Pankaj Parkar

คำตอบ:


398

มีสามารถเข้าถึงได้ในแม่แบบและใช้ในObject.keys*ngFor

@Component({
  selector: 'app-myview',
  template: `<div *ngFor="let key of objectKeys(items)">{{key + ' : ' + items[key]}}</div>`
})

export class MyComponent {
  objectKeys = Object.keys;
  items = { keyOne: 'value 1', keyTwo: 'value 2', keyThree: 'value 3' };
  constructor(){}
}


25
นี่เป็นโซลูชันที่ดีและมีประสิทธิภาพยิ่งขึ้น
Aous1000

1
@tomtastico คุณจะแสดงสิ่งนี้สำหรับอาร์เรย์ 3D อย่างไร ตัวอย่างเช่น {"1": {"1.1": ["1.1.1", "1.1.2"]}} และทำรัง 3 ngFor's
Frank

@ Frank คุณเพียงแค่พูดด้วยตัวเอง ทำรัง*ngForของ สองคนแรกที่ใช้โดยobjectKeysไม่จำเป็นที่สุด (เพราะเป็นเพียงอาร์เรย์)
tomtastico

1
น่ากลัว การตั้งค่า objectKeys = Object.keys เป็นวิธีที่ง่ายที่สุดที่ฉันเคยเห็นเพื่อตรวจสอบความยาวของวัตถุจาก HTML
JAC

394

เช่นเดียวกับในAngular รีลีสล่าสุด (v6.1.0)ทีม Angular ได้เพิ่มไพพ์แบบบิวด์อินใหม่สำหรับชื่อเดียวกับไพพ์keyvalueเพื่อช่วยคุณย้ำผ่านวัตถุแผนที่และอาร์เรย์ในcommonโมดูลของแพ็คเกจเชิงมุม ตัวอย่างเช่น -

<div *ngFor="let item of testObject | keyvalue">
    Key: <b>{{item.key}}</b> and Value: <b>{{item.value}}</b>
</div>

ตัวอย่างการทำงานแยก

ตรวจสอบข้อมูลที่เป็นประโยชน์เพิ่มเติมได้ที่นี่

หากคุณกำลังใช้ Angular v5 หรือต่ำกว่าหรือคุณต้องการบรรลุการใช้ pipe ตามคำตอบนี้


1
ฮ่า ๆ ฉันต้องทำการอัปเดต ng6 เพื่อเข้าถึงท่อนี้ - สิ่งที่ดี - ขอบคุณ
danday74

36
คุณสามารถรักษาลำดับคีย์ดั้งเดิมโดยใช้ตัวเปรียบเทียบที่กำหนดเอง: *ngFor="let item of testObject | keyvalue:keepOriginalOrder" และในชั้นเรียนของคุณกำหนด: public keepOriginalOrder = (a, b) => a.key
mike-shtil

2
public keepOriginalOrder = (a, b) => a.key ขอบคุณมากสำหรับสิ่งนี้
Kumaresan Perumal

1
นี่ควรเป็นคำตอบ - ใช้งานได้ดีกับเชิงมุม 7
calios

1
ไม่น่าเชื่อนี่ไม่ได้ออกมีตั้งแต่รุ่นแรก
Carlos Pinzón

227

คุณสามารถสร้างไปป์ที่กำหนดเองเพื่อส่งคืนรายการคีย์สำหรับแต่ละองค์ประกอบ อะไรแบบนั้น:

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

@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    for (let key in value) {
      keys.push(key);
    }
    return keys;
  }
}

และใช้มันอย่างนั้น:

<tr *ngFor="let c of content">           
  <td *ngFor="let key of c | keys">{{key}}: {{c[key]}}</td>
</tr>

แก้ไข

คุณสามารถส่งคืนรายการที่มีทั้งรหัสและค่า:

@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    for (let key in value) {
      keys.push({key: key, value: value[key]});
    }
    return keys;
  }
}

และใช้มันอย่างนั้น:

<span *ngFor="let entry of content | keys">           
  Key: {{entry.key}}, value: {{entry.value}}
</span>

1
สังเกตวงเล็บปิดที่หายไปในkeys.push({key: key, value: value[key]);
Marton Pallagi

49
จริง ๆ แล้วฉันไม่แนะนำให้ใครใช้ท่อเพื่อสร้างคอลเล็กชั่นที่*ngForแสดงออก มันสร้างคอขวดที่มีประสิทธิภาพสูงเนื่องจากจำเป็นต้องสร้างคอลเลกชันทุกครั้งที่เครื่องตรวจจับการเปลี่ยนแปลงตรวจสอบการเปลี่ยนแปลง
martin

3
ขอบคุณสำหรับการแก้ปัญหา ... ปัญหาคือเมื่อใดก็ตามที่วัตถุมีการเปลี่ยนแปลงไปป์จะไม่อัปเดต ถ้าฉันเพิ่มpure:falseไปป์มันจะไม่มีประสิทธิภาพมาก คุณมีวิธีแก้ปัญหาเพื่อปรับปรุงท่อด้วยตนเองทุกครั้งที่ฉันเปลี่ยนวัตถุ (ลบรายการ) หรือไม่
ncohen

4
คำตอบนั้นล้าสมัยไปเล็กน้อย บรรทัด * ngFor = "# รายการเนื้อหา | คีย์" ทำงานไม่ถูกต้องและสำหรับ ... ในลูปดีกว่าที่จะเปลี่ยนเป็น "สำหรับ (คีย์ const ของ Object.keys (ค่า))"
Experimenter

2
@RachChen ไม่ได้อยู่ในเทมเพลต: common: NgFor has been removed as it was deprecated since v4. Use NgForOf instead. This does not impact the use of*ngFor in your templates.( jaxenter.com/road-to-angular-5-133253.html )
mwld

49

ปรับปรุง

ใน6.1.0-beta.1 KeyValuePipeเปิดตัวhttps://github.com/angular/angular/pull/24319

<div *ngFor="let item of {'b': 1, 'a': 1} | keyvalue">
  {{ item.key }} - {{ item.value }}
</div>

ตัวอย่างพลั่ว

รุ่นก่อนหน้า

อีกวิธีหนึ่งคือการสร้างNgForInคำสั่งที่จะใช้เช่น:

<div *ngFor="let key in obj">
   <b>{{ key }}</b>: {{ obj[key] }}
</div>

ตัวอย่างพลั่ว

ngforin.directive.ts

@Directive({
  selector: '[ngFor][ngForIn]'
})
export class NgForIn<T> extends NgForOf<T> implements OnChanges {

  @Input() ngForIn: any;

  ngOnChanges(changes: NgForInChanges): void {
    if (changes.ngForIn) {
      this.ngForOf = Object.keys(this.ngForIn) as Array<any>;

      const change = changes.ngForIn;
      const currentValue = Object.keys(change.currentValue);
      const previousValue = change.previousValue ? Object.keys(change.previousValue) : undefined;
      changes.ngForOf =  new SimpleChange(previousValue, currentValue, change.firstChange);

      super.ngOnChanges(changes);
    }
  }
}

43

จาก Angular 6.1 คุณสามารถใช้keyvalue pipe ได้:

<div *ngFor="let item of testObject | keyvalue">
    Key: <b>{{item.key}}</b> and Value: <b>{{item.value}}</b>
</div>

แต่มีความไม่สะดวกที่เรียงลำดับรายการผลลัพธ์ด้วยค่าคีย์ หากคุณต้องการสิ่งที่เป็นกลาง:

@Pipe({ name: 'keyValueUnsorted', pure: false  })
export class KeyValuePipe implements PipeTransform {
  transform(input: any): any {
    let keys = [];
    for (let key in input) {
      if (input.hasOwnProperty(key)) {
        keys.push({ key: key, value: input[key]});
      }
    }
    return keys;
  }
}

อย่าลืมระบุแอตทริบิวต์pure: false pipe ในกรณีนี้ไพพ์จะถูกเรียกใช้ในแต่ละรอบการตรวจจับการเปลี่ยนแปลงแม้ว่าการอ้างอิงอินพุตจะไม่เปลี่ยนแปลง (เช่นในกรณีที่คุณเพิ่มคุณสมบัติให้กับวัตถุ)


แบ่งปันคำตอบเดียวกันข้างบนstackoverflow.com/a/51491848/5043867 แล้ว
Pardeep Jain

26

ตัวอย่างคำตอบของ @ Thierry อย่างละเอียด

ไม่มีkey and valueไพพ์ภายในหรือวิธีการที่จะได้รับจากการวนซ้ำ * ngFor ดังนั้นเราต้องสร้างไปป์ที่กำหนดเองสำหรับเดียวกัน ตามที่กล่าวว่านี่เป็นคำตอบด้วยรหัส

** คลาสไปป์ใช้วิธีการแปลงอินเทอร์เฟซของ PipeTransform ซึ่งรับค่าอินพุตและอาร์เรย์ทางเลือกของสตริงพารามิเตอร์และส่งคืนค่าที่แปลงแล้ว

** วิธีการเปลี่ยนรูปเป็นสิ่งจำเป็นสำหรับท่อ ส่วนต่อประสาน PipeTransform จะกำหนดวิธีการนั้นและให้คำแนะนำเครื่องมือและคอมไพเลอร์ มันเป็นตัวเลือก; Angular ค้นหาและดำเนินการวิธีการแปลงโดยไม่คำนึงถึง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับท่ออ้างอิงที่นี่

import {Component, Pipe, PipeTransform} from 'angular2/core';
import {CORE_DIRECTIVES, NgClass, FORM_DIRECTIVES, Control, ControlGroup, FormBuilder, Validators} from 'angular2/common';

@Component({
    selector: 'my-app',
    templateUrl: 'mytemplate.html',
    directives: [CORE_DIRECTIVES, FORM_DIRECTIVES],
    pipes: [KeysPipe]
})
export class AppComponent { 

  demo = {
    'key1': 'ANGULAR 2',
    'key2': 'Pardeep',
    'key3': 'Jain',
  }
}


@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    for (let key in value) {
      keys.push({key: key, value: value[key]});
    }
    return keys;
  }
}

และส่วน HTML คือ:

<ul>
  <li *ngFor='#key of demo | keys'>
   Key: {{key.key}}, value: {{key.value}}
  </li>
</ul>

การทำงานของ Plnkr http://plnkr.co/edit/50LlK0k6OnMnkc2kNHM2?p=preview

อัปเดตเป็น RC

ตามที่แนะนำโดย user6123723 (ขอบคุณ) ในความคิดเห็นที่นี่คือการปรับปรุง

<ul>
  <li *ngFor='let key of demo | keys'>
   Key: {{key.key}}, value: {{key.value}}
  </li>
</ul>

จำเป็นต้องได้รับการอัปเดต: นี่คือคำเตือนที่ฉันได้รับ "#" ด้านในของนิพจน์นั้นเลิกใช้แล้ว ใช้ "ให้" แทน! ("</li> -> <ul * ngIf =" demo "> <li [ข้อผิดพลาด ->] * ngFor = '# สำคัญของการสาธิต | keys'> คีย์: {{key.key}}, ค่า: { {key.value}} </li> "): myComponent @ 56: 6
user6123723

ไม่แน่ใจว่าเป็นของใหม่หรือไม่หากอ้างถึงจากเอกสาร:> เราต้องรวมไพพ์ของเราในอาร์เรย์การประกาศของ AppModule
Akzidenzgrotesk

18

@Marton มีข้อคัดค้านที่สำคัญสำหรับคำตอบที่ยอมรับเนื่องจากท่อสร้างคอลเลกชันใหม่ในการตรวจจับการเปลี่ยนแปลงแต่ละครั้ง ฉันจะสร้าง HtmlService ซึ่งมีฟังก์ชั่นยูทิลิตี้หลากหลายซึ่งมุมมองสามารถใช้ดังนี้

@Component({
  selector: 'app-myview',
  template: `<div *ngFor="let i of html.keys(items)">{{i + ' : ' + items[i]}}</div>`
})
export class MyComponent {
  items = {keyOne: 'value 1', keyTwo: 'value 2', keyThree: 'value 3'};
  constructor(private html: HtmlService){}
}

@Injectable()
export class HtmlService {
  keys(object: {}) {
    return Object.keys(object);
  }
  // ... other useful methods not available inside html, like isObject(), isArray(), findInArray(), and others...
}

2
และมันจะดีกว่าแค่Object.keys(...)ใน * ngFor อย่างไร
Simon_Weaver

8
เพราะมันจะโยน: TypeError: Cannot read property 'keys' of undefined. ดูเหมือนจะไม่ได้รับการสนับสนุนในแม่แบบ
Stephen Paul

1
มันทำงานได้ดีมากในการแก้ปัญหาและหลีกเลี่ยงปัญหาด้านประสิทธิภาพที่ระบุไว้ข้างต้น stackoverflow.com/questions/35534959/…
J. Adam Connor

สวัสดี b นี้ไม่สามารถใช้ในtemplateตัวเลือก แต่ในรหัส html ที่แท้จริงของแม่แบบ? ขอบคุณ
Scaramouche

16

หากคุณกำลังใช้งาน Lodash อยู่แล้วคุณสามารถทำตามวิธีการง่าย ๆ ซึ่งรวมถึงทั้งรหัสและค่า:

<ul>
  <li *ngFor='let key of _.keys(demo)'>{{key}}: {{demo[key]}}</li>
</ul>

ในไฟล์ typescript รวมถึง:

import * as _ from 'lodash';

และในองค์ประกอบที่ส่งออกรวมถึง:

_: any = _;

ขออภัยไม่จำเป็นต้องใช้ห้องสมุดเพิ่มเติมเช่น Lodash สำหรับสิ่งต่าง ๆ anyways ยินดีต้อนรับวิธีการใหม่เสมอ :)
Pardeep Jain

8

ขอบคุณสำหรับท่อ แต่ฉันต้องทำการเปลี่ยนแปลงบางอย่างก่อนที่ฉันจะสามารถใช้ในเชิงมุม 2 RC5 เปลี่ยนสายการนำเข้าท่อและเพิ่มประเภทของการเริ่มต้นอาร์เรย์คีย์ใด ๆ

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

 @Pipe({name: 'keys'})
 export class KeysPipe implements PipeTransform {
 transform(value) {
   let keys:any = [];
   for (let key in value) {
      keys.push( {key: key, value: value[key]} );
    }
     return keys;
  }
}

ใช่การนำเข้าเปลี่ยนแล้ว
Pardeep Jain

7

ไม่มีคำตอบที่นี่สำหรับฉันออกจากกล่องนี่คือสิ่งที่ได้ผลสำหรับฉัน:

สร้างpipes/keys.tsด้วยเนื้อหา:

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

@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform
{
    transform(value:any, args:string[]): any {
        let keys:any[] = [];
        for (let key in value) {
            keys.push({key: key, value: value[key]});
        }
        return keys;
    }
}

เพิ่มไปที่app.module.ts(โมดูลหลักของคุณ):

import { KeysPipe } from './pipes/keys';

จากนั้นเพิ่มการประกาศโมดูลของคุณลงในอาร์เรย์ดังนี้

@NgModule({
    declarations: [
        KeysPipe
    ]
})
export class AppModule {}

จากนั้นในเทมเพลตมุมมองของคุณคุณสามารถใช้สิ่งนี้:

<option *ngFor="let entry of (myData | keys)" value="{{ entry.key }}">{{ entry.value }}</option>

นี่คือการอ้างอิงที่ดีฉันพบว่าถ้าคุณต้องการอ่านเพิ่มเติม


ฉันขอทราบความแตกต่างระหว่างคำตอบของคุณและคำตอบอื่น ๆ (ใช้ไปป์เท่านั้น) ที่ให้ไว้ข้างต้นได้อย่างไร ดูเหมือนกับข้างบน
Pardeep Jain

1
แน่นอน 1. ตัวอย่างด้านบนใช้ * ngFor = "# entry" แทน * ngFor = "ให้รายการของ" และคอมไพเลอร์ของฉันไม่ยอมรับไวยากรณ์ #entry การอ้างอิงไม่ได้ใช้ # อย่างใดอย่างหนึ่ง "ให้รายการ (myData | keys)" น่าจะเป็นทางออกที่ดีกว่า 2. คอมไพเลอร์ของฉันไม่ได้ตรวจสอบตัวอย่าง Pipe Class อย่างใดอย่างหนึ่งเพราะมันขาดประเภทข้อมูลที่ชัดเจนดังนั้นฉันจึงเพิ่มว่า 3. ตัวอย่างข้างต้นไม่แสดงวิธีการรวมท่อเข้ากับโครงการที่คำตอบของฉันทำคุณต้องนำเข้าลงในโมดูลหลัก
cjohansson

haha ใช่ offcourese เพราะเมื่อคำตอบที่ได้รับในเวลานั้นรวมถึงไวยากรณ์#btw คำตอบของคุณก็แก้ไขได้อย่างไม่ต้องสงสัยเลย
Pardeep Jain

6

มีห้องสมุดที่ดีจริงๆที่ทำสิ่งนี้ได้ในหมู่คนอื่น มันเรียกว่าNGX ท่อ

ตัวอย่างเช่น keys pipe ส่งคืนคีย์สำหรับวัตถุและไพพ์ค่าส่งคืนค่าสำหรับวัตถุ:

ท่อกุญแจ

<div *ngFor="let key of {foo: 1, bar: 2} | keys">{{key}}</div> 
<!-- Output: 'foo' and 'bar -->

ท่อค่า

<div *ngFor="let value of {foo: 1, bar: 2} | values">{{value}}</div>
<!-- Output: 1 and 2 -->

ไม่จำเป็นต้องสร้างไปป์ที่คุณกำหนดเอง :)


2
ทางเลือกที่ดี แต่สิ่งที่เป็นเหตุผลที่จะใช้ห้องสมุดภายนอกเพื่อความสงบสุขของรหัสง่าย ๆ ถ้าเราสามารถทำได้โดยใช้โค้ดอย่างง่าย ๆ เช่น pipe
Pardeep Jain

2
อืมม ... แต่มันเป็นท่อเหรอ? มันเป็นเพียงหนึ่งบรรทัดใน package.json ของคุณและอีกสองบรรทัดในโมดูลของคุณเมื่อคุณนำเข้าห้องสมุด ในทางตรงข้ามไพพ์ที่กำหนดเองต้องการไฟล์แยกต่างหากที่มีโค้ด 10-20 บรรทัดและบรรทัดนำเข้าในโมดูลของคุณ เราพบว่าการใช้ ngx-pipes นั้นง่ายมากในโครงการของเรา ทำไมเราต้องบูรณาการล้อ? :)
RichieRock

ใช่ไม่ต้องสงสัยความจริงตามความเห็นของคุณสามารถเลือกระหว่างสองคนนี้ไม่มีใครผิดทาง
Pardeep Jain

2
อย่าลืมถ้าคุณเขียนท่อที่กำหนดเองคุณต้องทดสอบท่อที่กำหนดเองที่เป็นอย่างดี นั่นคือรหัสท่อ 10-20 บรรทัดและอาจเป็น 20-40 บรรทัดของรหัสทดสอบเพื่อทดสอบท่อ
danwellman

4

ใช้ดัชนี:

<div *ngFor="let value of Objects; index as key">

การใช้งาน:

{{key}} -> {{value}}

1
นั่นเป็นสิ่งที่แปลกใหม่สำหรับฉันดีกว่าถ้าคุณสามารถเพิ่มตัวอย่างพร้อมกับคำตอบของคุณ :) คุณสามารถชี้ให้ฉันไปที่เอกสารใด ๆ
Pardeep Jain

ประเภทของวัตถุคืออะไร? อาเรย์หรือแผนที่? โปรดระบุให้ชัดเจน ขอบคุณล่วงหน้า
Basil Mohammed

3

นี่คือทางออกที่ง่าย

คุณสามารถใช้ตัวพิมพ์ดีด typescript สำหรับสิ่งนี้

import {Component} from 'angular2/core';
declare var Symbol;
@Component({
    selector: 'my-app',
    template:`<div>
    <h4>Iterating an Object using Typescript Symbol</h4><br>
Object is : <p>{{obj | json}}</p>
</div>
============================<br>
Iterated object params are:
<div *ngFor="#o of obj">
{{o}}
</div>

`
})
export class AppComponent {
  public obj: any = {
    "type1": ["A1", "A2", "A3","A4"],
    "type2": ["B1"],
    "type3": ["C1"],
    "type4": ["D1","D2"]
  };

  constructor() {
    this.obj[Symbol.iterator] =  () => {
          let i =0;

          return {
            next: () => {
              i++;
              return {
                  done: i > 4?true:false,
                  value: this.obj['type'+i]
              }
            }
          }
    };
  }
}

http://plnkr.co/edit/GpmX8g?p=info


3

เปลี่ยนประเภทการสาธิตเป็นอาร์เรย์หรือวนซ้ำวัตถุของคุณและกดไปที่อาร์เรย์อื่น

public details =[];   
Object.keys(demo).forEach(key => {
      this.details.push({"key":key,"value":demo[key]);
    });

และจาก html:

<div *ngFor="obj of details">
  <p>{{obj.key}}</p>
  <p>{{obj.value}}</p>
  <p></p>
</div>

นี่ไม่ใช่วิธีการที่เหมาะสมซึ่งทุกคนสามารถทำได้อย่างง่ายดาย
Pardeep Jain

1

ฉันคิดว่า Object.key เป็นทางออกที่ดีที่สุดสำหรับปัญหานี้ สำหรับทุกคนที่เจอคำตอบนี้และพยายามหาสาเหตุที่ทำให้ Object.keys ให้พวกเขา ['0', '1'] แทนที่จะเป็น ['key1', 'key2'] เรื่องเตือน - ระวังความแตกต่างระหว่าง " จาก "และ" ใน ":

ฉันใช้ Object.key อยู่แล้วสิ่งที่คล้ายกับสิ่งนี้:

interface demo {
    key: string;
    value: string;
}

createDemo(mydemo: any): Array<demo> {
    const tempdemo: Array<demo> = [];

    // Caution: use "of" and not "in"
    for (const key of Object.keys(mydemo)) {
        tempdemo.push(
            { key: key, value: mydemo[key]}
        );
    }

    return tempdemo;
}

อย่างไรก็ตามแทนที่จะ

for (const key OF Object.keys(mydemo)) {

ฉันเขียนโดยไม่ได้ตั้งใจ

for (const key IN Object.keys(mydemo)) {

ซึ่ง "ทำงาน" ได้อย่างสมบูรณ์แบบโดยไม่มีข้อผิดพลาดและส่งคืน

[{key: '0', value: undefined}, {key: '1', value: undefined}]

นั่นทำให้ฉันต้องใช้เวลาประมาณ 2 ชั่วโมงกับ googling และ cursing ..

(ตบหน้าผาก)


1

คุณสามารถรับกุญแจของวัตถุแบบไดนามิกได้โดยลองสิ่งนี้

myObj['key']

0

ตอนนี้คุณต้องทำแบบนี้ฉันรู้ว่าไม่มีประสิทธิภาพมากเพราะคุณไม่ต้องการแปลงวัตถุที่คุณได้รับจาก firebase

    this.af.database.list('/data/' + this.base64Email).subscribe(years => {
        years.forEach(year => {

            var localYears = [];

            Object.keys(year).forEach(month => {
                localYears.push(year[month])
            });

            year.months = localYears;

        })

        this.years = years;

    });
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.