簡體   English   中英

按另一個對象數組引用對一組對象進行排序

[英]Sort aray of objects by another array of objects reference

我需要一些幫助來整理這些數據,我有一系列產品,我需要按設置配置進行排序和顯示。 output 必須與設置數組(索引)具有相同的順序,並且如果顯示為真。 提前致謝。 這是我嘗試過的:

 var products = [ {id: 0, name: 'Chocolate', category: 'Sweet'}, {id: 1, name: 'Almendras', category: 'Fruit'}, {id: 2, name: 'Nueces', category: 'Fruit'}, {id: 3, name: 'Mermelada', category: 'Jam'}, {id: 4, name: 'Alfajor', category: 'Sweet'}, {id: 5, name: 'Queso', category: 'UwU'}, {id: 6, name: 'Arandanos', category: 'Fruit'}, {id: 7, name: 'Maracuya', category: 'Fruit'} ]; let settings = [ { name: 'Fruit', display: true }, { name: 'Jam', display: false }, { name: 'Sweet', display: true }, { name: 'UwU', display: true } ] let group = products.reduce((r, a) => { r[a.category] = [...r[a.category] || [], a]; return r; }, {}); let arrangedProducts = Object.keys(group); console.log(group); console.log(arrangedProducts);

這是我預期的 output:

 /* expected result = [ [ {id: 1, name: 'Almendras', category: 'Fruit'}, {id: 2, name: 'Nueces', category: 'Fruit'}, {id: 6, name: 'Arandanos', category: 'Fruit'}, {id: 7, name: 'Maracuya', category: 'Fruit'} ], [ {id: 0, name: 'Chocolate', category: 'Sweet'}, {id: 4, name: 'Alfajor', category: 'Sweet'} ], [ {id: 5, name: 'Queso', category: 'UwU'} ] ] */

解決方案

  1. 團體制作
  2. 應用設置並檢索結果

 const products = [ { id: 0, name: "Chocolate", category: "Sweet" }, { id: 1, name: "Almendras", category: "Fruit" }, { id: 2, name: "Nueces", category: "Fruit" }, { id: 3, name: "Mermelada", category: "Jam" }, { id: 4, name: "Alfajor", category: "Sweet" }, { id: 5, name: "Queso", category: "UwU" }, { id: 6, name: "Arandanos", category: "Fruit" }, { id: 7, name: "Maracuya", category: "Fruit" }, ]; const productsGroup = products.reduce((r, a) => { r[a.category] = [...(r[a.category] || []), a]; return r; }, {}); function applySettings(settings) { return settings.filter((s) => s.display).map((s) => productsGroup[s.name]); } console.log( applySettings([ { name: "Fruit", display: true, }, { name: "Jam", display: false, }, ]) ); console.log( applySettings([ { name: "Fruit", display: true, }, { name: "Sweet", display: true, }, { name: "UwU", display: true, }, ]) );

您可以根據display屬性過濾settings列表,然后使用Array.map返回與類別匹配的products中的對象列表:

 const products = [ {id: 0, name: 'Chocolate', category: 'Sweet'}, {id: 1, name: 'Almendras', category: 'Fruit'}, {id: 2, name: 'Nueces', category: 'Fruit'}, {id: 3, name: 'Mermelada', category: 'Jam'}, {id: 4, name: 'Alfajor', category: 'Sweet'}, {id: 5, name: 'Queso', category: 'UwU'}, {id: 6, name: 'Arandanos', category: 'Fruit'}, {id: 7, name: 'Maracuya', category: 'Fruit'} ]; const settings = [ { name: 'Fruit', display: true }, { name: 'Jam', display: false }, { name: 'Sweet', display: true }, { name: 'UwU', display: true } ]; const result = settings.filter(c => c.display).map(c => products.filter(o => o.category == c.name)); console.log(result);

請注意,此代碼會過濾具有display:true的每個settings值的products數組,因此對於大型 arrays 可能會很慢。 但是filter的開銷非常低,並且使用 OP 的示例數據進行測試表明,它的運行速度是reduce版本的 3 倍; 並使用更大的products數組(99 個條目)運行速度提高 10 倍。

這應該很快,因為當displayfalse時,它會continue下一次迭代而不執行內部循環:

 var products = [ {id: 0, name: 'Chocolate', category: 'Sweet'}, {id: 1, name: 'Almendras', category: 'Fruit'}, {id: 2, name: 'Nueces', category: 'Fruit'}, {id: 3, name: 'Mermelada', category: 'Jam'}, {id: 4, name: 'Alfajor', category: 'Sweet'}, {id: 5, name: 'Queso', category: 'UwU'}, {id: 6, name: 'Arandanos', category: 'Fruit'}, {id: 7, name: 'Maracuya', category: 'Fruit'} ]; let settings = [ { name: 'Fruit', display: true }, { name: 'Jam', display: false }, { name: 'Sweet', display: true }, { name: 'UwU', display: true } ]; function sortProducts(){ const r = []; let i = -1; for(let s of settings){ if(.s;display){ continue; } i++. for(let o of products){ if(s.name === o.category){ if(r[i]){ r[i];push(o). } else{ r;push([o]); } } } } return r. } console;log(sortProducts());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM