代码之家  ›  专栏  ›  技术社区  ›  Brandon Michael Hunter

TypeScript中forEach循环的问题

  •  0
  • Brandon Michael Hunter  · 技术社区  · 7 年前

    我的TypeScript代码有问题,在forEach循环中,页面上显示未定义的代码。以下是我对is my forEach语句的代码:

    private _renderList(items: ISPList[]): void {
        let html: string = '<div class="ms-Grid"><div class="ms-Grid-row">';
        items.forEach((item: ISPList) => {
          html += `
          <div class="ms-Grid-col ms-u-sm4 ms-u-md4 ms-u-lg4">
          <h2>${item.DisplayListTitle}</h2>
          <div>${item.ListItems.length}</div>
          <div>${item.ListItems.forEach((listItem: ListObject,index) => {
    
          })}</div>
          </div>`;
        });
        html +="</div></div>";    
        const listContainer: Element = this.domElement.querySelector('#spListContainer');
        listContainer.innerHTML = html;
      }
    

    正在通过我的getMockListData方法填充数据(请参见下文):

    private _getMockListData(): Promise<ISPLists> {
        return MockHttpClient.get()
          .then((data: ISPList[]) => {
            var listData: ISPLists = { value: data };
            return listData;
          }) as Promise<ISPLists>;
      }
    

    export default class MockHttpClient  {
       //Add some mock data to this for testing.
       private static _createListItems: ListObject[] = [
           {Title:'Doc1', FileType:'docx',ItemUrl:'http://www.espn.com', ItemType:'Document Library'},
           {Title:'Doc2', FileType:'docx',ItemUrl:'http://www.espn.com', ItemType:'Document Library'}];
       public static _applyListItems: ListObject[] = [
            {Title:'ListItem 1', FileType:'ListItem',ItemUrl:'http://www.espn.com', ItemType:'List'},
            {Title:'ListItem 2', FileType:'ListItem',ItemUrl:'http://www.espn.com', ItemType:'List'}];
       public static _deployListItems: ListObject[] = [
                {Title:'ListItem 2', FileType:'ListItem',ItemUrl:'http://www.espn.com', ItemType:'List'},
                {Title:'ListItem 3', FileType:'ListItem',ItemUrl:'http://www.espn.com', ItemType:'List'}]; 
       public static _supportListItems: ListObject[] = [
                    {Title:'ListItem 5 ', FileType:'ListItem',ItemUrl:'http://www.espn.com', ItemType:'List'},
                    {Title:'ListItem 6', FileType:'ListItem',ItemUrl:'http://www.espn.com', ItemType:'List'}]; 
    
       private static _items: ISPList[] = [
           { Title: 'Mock List',   Id: '1', ListType:"List", DisplayListTitle:'CREATE',  RowCount: 4, SortOrder:1, ShowOnHomePage:true,ListItems:MockHttpClient._createListItems},
           { Title: 'Mock List 2', Id: '2', ListType:"Library", DisplayListTitle:'APPLY', RowCount: 4, SortOrder:2, ShowOnHomePage:true,ListItems:MockHttpClient._applyListItems },
           { Title: 'Mock List 3', Id: '3', ListType:"List", DisplayListTitle:'DEPLOY',RowCount: 4, SortOrder:3, ShowOnHomePage:true,ListItems:MockHttpClient._deployListItems },
           { Title: 'Mock List 4', Id: '4', ListType:"Library", DisplayListTitle:'SUPPORT', RowCount: 4, SortOrder:4, ShowOnHomePage:true,ListItems:MockHttpClient._supportListItems }];
    
       public static get(): Promise<ISPList[]> {
       return new Promise<ISPList[]>((resolve) => {
               resolve(MockHttpClient._items);
           });
       }
    }
    

    以下是ISPList和ListObject的定义:

    export interface ISPLists { value: ISPList[]; }
    export interface ISPList {
      Title: string;
      Id: string;
      DisplayListTitle: string;
      RowCount: number;
      SortOrder: number;
      ShowOnHomePage: boolean;
      ListType: string;
      ListItems: Array<ListObject>;
    }
    export interface ListObject {
        Title: string;
        ItemUrl: string;
        ItemType: string;
        FileType: string;
    }
    

    请帮忙。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Quentin 2    7 年前

    台词:-

    item.ListItems.forEach((listItem: ListObject,index) => {
    
          }
    

    所以你需要创建一个返回字符串的函数。 forEach将始终返回未定义的。

    item.ListItems.map((listItem: ListObject,index) => `<a href="${
    listItem.ItemUrl}">${listItem.Title}</a>`).join('\n')
    
        2
  •  0
  •   hgiasac    7 年前

    Array.forEach 不返回值。它和for循环一样,必须定义一个外部变量并赋值。

    map 相反:

    const titles = item.ListItems.map((listItem: ListObject,index) => {
      return listItem.Title;
    
      // join array string to a string with "," delimiter
    }).join(", ");
    
    推荐文章