繁体   English   中英

如何遍历Typescript中的对象?

[英]How to traverse an Object in Typescript?

我有一个接收对象的函数,它看起来像下面的一个,

Object(12)

0: "UQ"

1: "YTL"

2: "VZW"

3: "LGT"

4: "KDDI"

5: "KT"

6: "SPRINT_T"

7: "RIL"

8: "SKT"
​
9: "SPRINT"
​
10: "KPS"
​
11: "GLB1"

并将其分配给变量名称是 results: string [];

现在我使用 forEach 遍历整个数组,但我不能。 然后我打印显示 0 的对象的长度。

但我可以使用 results[0] 或 results[1] 访问名称。 但我不能使用循环。

现在,我如何遍历整个对象并访问所有名称,如“UK”、“YTL”。

使用 Object.keys()。 由于这不是数组而是对象,因此不能使用 forEach。

Object.keys(myObject)
    .sort((x, y) => x >= y ? 1 : -1) // for order preserving, can be omitted if order doesn't matter
    .forEach(key => {
       const value = myObject[key];
    })

在 Typescript 中,您可以通过两种方式分配 json 数据。

  1. 按原样分配对象:

假设您将 json 数据存储在变量名 data.json 中。 然后您可以按原样分配它。

data: string[];
this.service.getData()
    .subscribe(
      (data: string[]) => {
        this.data = data;
});

通过这种方式,您可以使用 Foreach 或您对这个问题的期望。

  1. 另一种使用括号进行分配的方法,如下所示:

通过这种方式,您可以将该 json 数据分配为您在问题中显示的对象。

data: string[];
this.service.getData()
    .subscribe(
      (data: string[]) => {
        this.data = {... data };
});

在您的问题中,您必须使用第一个。

我通过TypeScript创建了一个示例来遍历一个对象并获取所有终端节点,希望对您有所帮助:

终端node.ts:

function getCurrentLevelTerminalNodes(obj: any, maxDepth = 100) {
  if (maxDepth <= 0) {
    throw new Error('Too deep to traverse!');
  }

  const res: any[] = [];

  Object.keys(obj).forEach(value => {
    if (typeof obj[value] !== 'object') {
      res.push(obj[value]);
    } else {
      res.push(...getCurrentLevelTerminalNodes(obj[value], maxDepth - 1));
    }
  });

  return res;
}

export default function getTerminalNodes(obj: Object) {
  return getCurrentLevelTerminalNodes(obj);
}

测试用例:

import getTerminalNodes from './terminal-node';

describe('terminal-node', () => {
  it('get all terminal nodes', () => {
    const testObj = {
      a: {
        b: {
          c: 'c',
        },
      },
      b: 'b',
    };

    expect(getTerminalNodes(testObj)).toStrictEqual(['c', 'b']);
  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM