3 回答

TA貢獻1786條經(jīng)驗 獲得超11個贊
該代碼非常低效,因為您找到了東西,然后轉身又找到了東西。所以你最終會循環(huán)多次。
為了使其更具可讀性,我將其分成幾部分。它還在對象上循環(huán)一次以定位有子項和沒有子項的項。那里有一個三元運算符來處理有無。
然后代碼確定它是否是孩子并抓住對象。
// Grab the package
var selectedPackageProducts = this.deal.packages.find(p => p.isSelected).dealProducts;
// check to see if the children has the product type or if the parent does (if no children)
const selectedProduct = selectedPackageProducts.find(dp =>
dp.children.length > 0 ?
dp.children[0].product.productTypeCode === productType :
dp.product.productTypeCode === productType)
// If we have children use it, else reference the parent
const productObj = selectedProduct && selectedProduct.children.length ?
selectedProduct.children[0] :
selectedProduct;
// get the product name
const productName = productObj && productObj.product.name

TA貢獻1775條經(jīng)驗 獲得超11個贊
為了證明兩件事,我冒著風險,進入了一個似乎是意見交鋒的戰(zhàn)場。
以干凈的代碼和可讀性為目標并不總是只是為了傳教士或“我比你更了解”的態(tài)度。這主要是為了自己(以及團隊中的一員)的安寧與健康,尤其是為了那些必須在不久之后甚至更晚維護此類代碼的人。
通過重構 OP 的代碼以提高可讀性,可以實現(xiàn)三件事:
將重復和不必要的數(shù)據(jù)訪問減少到最必要的數(shù)據(jù),然后恰好一次。
實際上使它明顯/可讀(因此更容易重構)一個人正在處理什么樣的數(shù)據(jù)。
并最終實現(xiàn)了 OP 基于(嵌套)三元運算符的返回值的愿望,這在之前沒有清理的情況下并不是一件容易實現(xiàn)的任務。
private getProductName(productType: string): string {
const defaultProductName = 'Product not found';
const selectedPackageProductList = this.deal.packages
.find(p => p.isSelected).dealProducts;
const selectedProducts = selectedPackageProductList
.find(dp => (dp.children.length > 0 && dp.children[0].product.productTypeCode === productType));
const selectedProductItem = !selectedProducts && selectedPackageProductList
.find(dp => (dp.children.length === 0 && dp.product.productTypeCode === productType));
return selectedProducts
? selectedProducts.children[0].product.name
: (selectedProductItem ? selectedProductItem.product.name : defaultProductName);
}

TA貢獻1815條經(jīng)驗 獲得超10個贊
不用寫: IF condition THEN do_a ELSE do_b你可以用同樣的方式使用三元運算符。
(condition) ? do_a : do_b;
具體的例子:
private getProductName(productType: string): string {
return (this.deal.packages.find(p => p.isSelected).dealProducts.find(dp => (dp.children.length > 0 && dp.children[0].product.productTypeCode == productType)))
? this.deal.packages.find(p => p.isSelected).dealProducts.find(dp => (dp.children.length > 0 && dp.children[0].product.productTypeCode == productType)).children[0].product.name;
: (this.deal.packages.find(p => p.isSelected).dealProducts.find(dp => (dp.children.length === 0 && dp.product.productTypeCode === productType)))
? this.deal.packages.find(p => p.isSelected).dealProducts.find(dp => (dp.children.length === 0 && dp.product.productTypeCode === productType)).product.name;
: 'Product not found';
}
順便提一句。我建議為do_aor提取方法do_b。
添加回答
舉報