如何将数组中对象的属性分配给多个类属性?

时间:2020-01-02 11:02:17

标签: arrays typescript object foreach

我有一个带有2个私有属性和一个对象数组的打字稿类。

class AssigningProperties {
  private animalType1: string;
  private animalType2: string;

  animals = [
    {
      name: "Bob",
      type: "cat"
    },
    {
      name: "Max",
      type: "dog"
    }
  ];

  constructor() {
    this.animals.forEach(v => console.log(v.name));
  }
}

new AssigningProperties ();

我想将类属性animalType1分配给cat,将animalType2分配给dog,最好使用Array.foreach

我可以使用对象的索引来分配它,如下所示: this.animalType1 = this.animals[0].type;,但我觉得有更好的方法。帮助吗?

Link to CodeSandBox

1 个答案:

答案 0 :(得分:3)

您正在做的事情很好,但是如果您想循环执行,请将animalTypes做成一个数组:

private animalTypes: string[];

然后,您将在forEach回调中使用第二个参数,这是条目的索引:

this.animals.forEach((v, i) => v.type = this.animalTypes[i]);

或者如果您想将"cat"分配给第一个animalTypes(这是您的CodeSandbox代码正在执行的操作),则:

this.animals.forEach((v, i) => this.animalTypes[i] = v.type);

无论使用哪种方法,您最终都会将类型存储在两个地方,这会带来维护风险-您可以更新animals[0].type而无需更新animalType1 / animalTypes[0]。 / p>

假设您希望animals是真理的一个来源,则可以改用getter:

private get animalType1(): string {
 return this.animals[0].type;
}
private get animalType2(): string {
  return this.animals[1].type;
}

Live Copy on the playground

或者对于animalTypes方法,您将使用代理服务器:

interface Animal {
  name: string;
  type: string;
}
class AssigningProperties {
  animals: Animal[] = [
    {
      name: "Bob",
      type: "cat"
    },
    {
      name: "Max",
      type: "dog"
    }
  ];
  private animalTypes = new Proxy<Animal[]>(this.animals, {
    get(target, propName) {
      if (propName in target) {
        return Reflect.get(target, propName).type;
      }
      return undefined;
    }
  });
}

Live Copy on the playground