打字稿 - 从我的函数

时间:2017-06-21 07:05:10

标签: javascript typescript

我有两个修改列表的函数。该列表是对象的字段。这个对象有很多列表,我不想写几次相同的代码。我需要可重复使用的功能。

现在看起来如下:

setLists(): void {
  if (this.product.orders !== null) {
    this.orders = this.product.orders.join(', '); 
  } else {
    this.orders = '';
  }

  if (this.product.relatedProducts !== null) {
    this.relatedProducts = this.product.relatedProducts.join(', '); 
  } else {
    this.relatedProducts = '';
  }
}

这里只有2个字段,但实际上产品有很多列表。我不想为每个列表重复相同的操作。

第二个样板函数如下所示:

updateProductLists(): void {
  let splittedOrders: string[] = this.orders.split(",");
  splittedOrders = splittedOrders.map(o => o.trim());
  this.product.orders = new Array<string>();
  this.project.orders.push(...splittedOrders);

  let splittedRelatedProducts: string[] = this.relatedProducts.split(",");
  splittedRelatedProducts = splittedRelatedProducts.map(r => r.trim());
  this.product.relatedProducts = new Array<string>();
  this.product.relatedProducts.push(...splittedRelatedProducts);
}

2 个答案:

答案 0 :(得分:2)

以下是如何创建两个更通用的函数listToStringstringToList以及如何在代码中使用它们而不是一遍又一遍地编写相同内容的示例

// Your old method will now look like this
setLists(): void {
    this.orders = this.listToString(this.product.orders);
    this.relatedProducts = this.listToString(this.product.relatedProducts);
}

// Generic method for joining the arrays into strings the way you did
listToString(sourceList: any[]): string {
    return sourceList ? sourceList.join(', ') : '';
}

// Your old method will now look like this
updateProductLists(): void {
    this.product.orders = this.stringToList(this.orders);
    this.product.relatedProducts = this.stringToList(this.relatedProducts);
}

// Generic method for splitting the strings into lists the way you did
stringToList(sourceString: string): any[] {
    return sourceString.split(',').map(i => i.trim());
}

答案 1 :(得分:1)

就像你说的那样:你应该编写一个泛型函数,它接受任何类型的列表并对其执行逻辑。然后将所有列表放在一个数组中,并使用您编写的函数迭代它。例如:

function stringifyArray(array: any[], separator: string): string {
  if (!array) { // Checks for undefined, null, NaN, 0, empty string
    return '';
  }
  return array.join(separator);
}

const oldLists: any[][] = [
  this.orders,
  this.relatedproducts
]

const newLists: string[] = [];

for (let i = 0; i < oldLists.length; i++) {
  newLists.push(stringifyArray(oldLists[i], ','));
}

弄清楚如何为您需要执行的其他操作定义泛型函数,然后以相同的方式循环遍历列表。

顺便说一句,为列表及其字符串化版本提供单独的字段可能是个好主意。这样你就不必那么多来回转换。

另请注意,我的示例中的函数实际上是多余的,因为它复制了Array.prototype.join()中已存在的行为。非冗余代码将是:

const oldLists: any[][] = [
  this.orders,
  this.relatedproducts
]

const newLists: string[] = [];

for (let i = 0; i < oldLists.length; i++) {
  newLists.push(oldLists[i].join(','));
}