2017-06-21 106 views
0

我有2個功能修改列表。該列表是對象的字段。這個對象有很多列表,我不想幾次寫同一個代碼。我需要可重用的功能。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

下面是如何,您可以創建兩個通用功能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()); 
} 
+0

注意:如果對象的屬性是鍵入的(它們應該在TypeScript中,但似乎不是從問題來判斷),我相信會有一個試圖將一個字符串的值賦給之前是一個數組的變量的問題(反之亦然)。 – Vintr

+1

@Vintr你在哪裏看到用於字符串和數組值的相同變量?難道是你將'this.relatedProducts'與'this.product.relatedProducts'混合?或者我錯過了什麼? –

+0

的確我是。這種令人困惑的命名。 :) – Vintr

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(',')); 
}