【问题标题】:How to assign properties of objects in an array to multiple class properties?如何将数组中对象的属性分配给多个类属性?
【发布时间】:2020-04-21 01:16:26
【问题描述】:

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

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 分配给catanimalType2 分配给dog,最好使用Array.foreach

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

Link to CodeSandBox

【问题讨论】:

  • “我想将类属性animalType1 分配给cat...” 次要术语nitpick:“类属性”通常表示static 属性(a AssigningProperties 的属性,构造函数)。 animalType1 是一个 instance 属性。

标签: arrays typescript object foreach


【解决方案1】:

你正在做的很好,但是如果你想在一个循环中做,把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]

假设您希望 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

【讨论】:

  • 感谢您快速详细的回复。 Getter 是一种简单但有效的方法。我将深入了解Proxy 以了解它,但感谢您向我介绍它。超级足智多谋。
  • @ManishShrestha - 很高兴为您提供帮助! FWIW,我在第 14 章的书中介绍了代理(请参阅我的个人资料)。;-)
猜你喜欢
  • 2020-05-22
  • 2014-04-05
  • 2016-02-03
  • 2011-09-22
  • 2010-11-15
  • 2019-08-09
  • 2019-10-18
  • 2019-07-16
  • 1970-01-01
相关资源
最近更新 更多