繁体   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