剛剛開始深入研究 JavaScript 中的物件陣列排序,提出了以下代碼段。這段代碼是否有可能以某種方式針對性能進行優化,或者這看起來通常合法嗎?
const products = [
{
title: "Test product1",
description: "Test description",
price: 5,
category: {
title: 'hot_dishes',
priority: 2
},
ru: {
title: "Тестовый продукт",
description: "пошел на хуй"
}
},
{
title: "Test product2",
description: "Test description",
price: 5,
category: {
title: 'dessert',
priority: 1
},
ru: {
title: "Тестовый продукт",
description: "пошел на хуй"
}
}
];
const sorted = products
.map(({ category }) => category)
.sort((a, b) => parseFloat(a.priority) - parseFloat(b.priority))
.map(({ title }) => (
products.filter(({ category: { title: cTitle } }) => title === cTitle)
));
console.log(sorted);
作業流程:
- 分解每個產品的類別
- 按升序排序
- 根據類別標題在單獨的陣列中過濾
我目前最關心的是以下幾行:
.map(({ title }) => (
products.filter(({ category: { title: cTitle } }) => title === cTitle)
));
uj5u.com熱心網友回復:
您使用 間接對陣列進行排序priority,但您不必執行所有步驟。你可以只用排序上products也
const sorted = products.sort((a, b) => a.category.priority - b.category.priority);
const products = [
{
title: "Test product1",
description: "Test description",
price: 5,
category: {
title: "hot_dishes",
priority: 2
},
ru: {
title: "Тестовый продукт",
description: "пошел на хуй"
}
}, {
title: "Test product2",
description: "Test description",
price: 5,
category: {
title: "dessert",
priority: 1
},
ru: {
title: "Тестовый продукт",
description: "пошел на хуй"
}
}
];
const sorted = products.sort((a, b) => a.category.priority - b.category.priority);
console.log(sorted);
/* This is not a part of answer. It is just to give the output full height. So IGNORE IT */
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
您可以進一步優化它,根據輸入的形狀,有一些邊緣情況需要注意。
總體而言,您可以做的事情是將類別規范化為單獨的集合并參考產品中的類別 ID。這將消除在不同物件中具有具有不同優先級的相同類別標題的可能性。
您還沒有以保證排序順序的方式處理具有相同優先級的多個類別的排序行為,您應該按優先級和 alpha 按標題排序來解決這個問題。這種排序呼叫依賴于瀏覽器的 sort() 實作,因此應該得到很好的優化。
您的演算法為映射的每次迭代映射乘積并過濾乘積,時間復雜度為 O(n^2)。將其設為 O(n) 演算法將為您在大型資料集上節省大量時間。
我添加了一個片段,在排序之前使用 Map 對類別進行重復資料洗掉,并在使用 Map 進行分組之前快取類別陣列索引。與找到用于對產品進行分組的單遍演算法的整體改進相比,這些優化無疑是非常小的。
從去重和排序的類別陣列創建一個空的二維陣列。然后我們迭代產品陣列并將產品添加到適當的類別陣列中。
我們使排序更快、更準確;其他一切現在都在攤銷不變的時間內完成。
const products = [{
title: "Test product1",
description: "Test description",
price: 5,
category: {
title: 'hot_dishes',
priority: 2
},
ru: {
title: "Тестовый продукт",
description: "пошел на хуй"
}
},
{
title: "Test product2",
description: "Test description",
price: 5,
category: {
title: 'dessert',
priority: 1
},
ru: {
title: "Тестовый продукт",
description: "пошел на хуй"
}
}
];
const categoryComparator = (a, b) => {
const priorityComparison = parseFloat(a.priority) - parseFloat(b.priority)
if ( priorityComparison !== 0 ) return priorityComparison
return a.title.localeCompare(b)
}
const categoryMap = new Map()
products.forEach(product =>
categoryMap.set(product.category.title, product.category)
)
const sortedCategories = Array.from(categoryMap, ([title, category]) => category)
.sort(categoryComparator)
.map(category => category.title)
const categoryIndexMap = new Map([...new Set(sortedCategories)].map((category, index) => [category, index]))
const categorizedProductArrays = Array.from({
length: categoryIndexMap.size
}, i => [])
products.forEach((product) =>
categorizedProductArrays[categoryIndexMap.get(product.category.title)].push(product))
console.log(categorizedProductArrays)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/351246.html
標籤:javascript 数组 排序 筛选
