同时使用 reduce 和 sort (JavaScript)
Using reduce and sort together (JavaScript)
我有一个对象数组 (groceryArray),我想通过 groupId 属性(对象键)将其组织成一个对象,最后通过 groupDisplayOrder 属性 对这些键进行排序。请参阅最终输出以获得所需结果。
const groceryArray = [
{ id: 'apples', groupId: 'produce', groupDisplayOrder: 1 },
{ id: 'chicken', groupId: 'meat', groupDisplayOrder: 3 },
{ id: 'shrimp', groupId: 'seafood', groupDisplayOrder: 4 },
{ id: 'milk', groupId: 'dairy', groupDisplayOrder: 2 },
{ id: 'carrots', groupId: 'produce', groupDisplayOrder: 1 },
{ id: 'salmon', groupId: 'seafood', groupDisplayOrder: 4 }
]
想要的结果
const finalOutput = {
produce: [{ id: 'apples', groupId: 'produce', groupDisplayOrder: 1 }, { id: 'carrots', groupId: 'produce', groupDisplayOrder: 1 }],
dairy: [{ id: 'milk', groupId: 'dairy', groupDisplayOrder: 2 }],
meat: [{ id: 'chicken', groupId: 'meat', groupDisplayOrder: 3 }],
seafood: [{ id: 'shrimp', groupId: 'seafood', groupDisplayOrder: 4 }, { id: 'salmon', groupId: 'seafood', groupDisplayOrder: 4 }]
}
这是我当前的代码...我想我可能做的步骤太多了。请问有没有办法同时减少和排序?
const groceriesGroupedById = groceryArray.reduce((acc, cur) => {
if (cur.groupId) {
(acc[cur.groupId] || (acc[cur.groupId] = [])).push(cur)
}
return acc
}, {})
const sortedGroupIds = Object.keys(groceriesGroupedById).sort((a, b) => {
return groceriesGroupedById[a][0].groupDisplayOrder - groceriesGroupedById[b][0].groupDisplayOrder
})
const finalOutput = sortedGroupIds.reduce((acc, key) => ( acc[key] = groceriesGroupedById[key], acc ), {})
首先,使用Array.sort() and use Array.reduce()
对数组进行排序
const groceryArray = [
{ id: 'apples', groupId: 'produce', groupDisplayOrder: 1 },
{ id: 'chicken', groupId: 'meat', groupDisplayOrder: 3 },
{ id: 'shrimp', groupId: 'seafood', groupDisplayOrder: 4 },
{ id: 'milk', groupId: 'dairy', groupDisplayOrder: 2 },
{ id: 'carrots', groupId: 'produce', groupDisplayOrder: 1 },
{ id: 'salmon', groupId: 'seafood', groupDisplayOrder: 4 }
];
groceryArray.sort((a, b) => a.groupDisplayOrder - b.groupDisplayOrder);
const finalOutput = groceryArray.reduce((acc, cur) => {
if (!acc[cur.groupId]) acc[cur.groupId] = [];
acc[cur.groupId].push(cur);
return acc;
}, {});
console.log(finalOutput);
使用 Map
和 Array#reduce
您可以对数据进行分组,然后遍历所有值并对其进行排序。
const
groceryArray=[{id:"apples",groupId:"produce",groupDisplayOrder:1},{id:"chicken",groupId:"meat",groupDisplayOrder:3},{id:"shrimp",groupId:"seafood",groupDisplayOrder:4},{id:"milk",groupId:"dairy",groupDisplayOrder:2},{id:"carrots",groupId:"produce",groupDisplayOrder:1},{id:"salmon",groupId:"seafood",groupDisplayOrder:4}],
res = groceryArray.reduce((r, o) => ((r[o.groupId] ??= []), r[o.groupId].push(o), r), {});
Object.values(res).forEach((o) => o.sort(({ groupDisplayOrder: a }, { groupDisplayOrder: b }) => a - b));
console.log(res);
您可以通过使用数组和 groupDisplayOrder
以及以 groupId
作为键的对象来采用嵌套方法。
最后将所有对象组合成一个对象。
const
groceryArray = [{ id: 'apples', groupId: 'produce', groupDisplayOrder: 1 }, { id: 'chicken', groupId: 'meat', groupDisplayOrder: 3 }, { id: 'shrimp', groupId: 'seafood', groupDisplayOrder: 4 }, { id: 'milk', groupId: 'dairy', groupDisplayOrder: 2 }, { id: 'carrots', groupId: 'produce', groupDisplayOrder: 1 }, { id: 'salmon', groupId: 'seafood', groupDisplayOrder: 4 }],
result = Object.assign({}, ...groceryArray.reduce((r, o) => {
((r[o.groupDisplayOrder] ??= {})[o.groupId] ??= []).push(o);
return r;
}, []));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我有一个对象数组 (groceryArray),我想通过 groupId 属性(对象键)将其组织成一个对象,最后通过 groupDisplayOrder 属性 对这些键进行排序。请参阅最终输出以获得所需结果。
const groceryArray = [
{ id: 'apples', groupId: 'produce', groupDisplayOrder: 1 },
{ id: 'chicken', groupId: 'meat', groupDisplayOrder: 3 },
{ id: 'shrimp', groupId: 'seafood', groupDisplayOrder: 4 },
{ id: 'milk', groupId: 'dairy', groupDisplayOrder: 2 },
{ id: 'carrots', groupId: 'produce', groupDisplayOrder: 1 },
{ id: 'salmon', groupId: 'seafood', groupDisplayOrder: 4 }
]
想要的结果
const finalOutput = {
produce: [{ id: 'apples', groupId: 'produce', groupDisplayOrder: 1 }, { id: 'carrots', groupId: 'produce', groupDisplayOrder: 1 }],
dairy: [{ id: 'milk', groupId: 'dairy', groupDisplayOrder: 2 }],
meat: [{ id: 'chicken', groupId: 'meat', groupDisplayOrder: 3 }],
seafood: [{ id: 'shrimp', groupId: 'seafood', groupDisplayOrder: 4 }, { id: 'salmon', groupId: 'seafood', groupDisplayOrder: 4 }]
}
这是我当前的代码...我想我可能做的步骤太多了。请问有没有办法同时减少和排序?
const groceriesGroupedById = groceryArray.reduce((acc, cur) => {
if (cur.groupId) {
(acc[cur.groupId] || (acc[cur.groupId] = [])).push(cur)
}
return acc
}, {})
const sortedGroupIds = Object.keys(groceriesGroupedById).sort((a, b) => {
return groceriesGroupedById[a][0].groupDisplayOrder - groceriesGroupedById[b][0].groupDisplayOrder
})
const finalOutput = sortedGroupIds.reduce((acc, key) => ( acc[key] = groceriesGroupedById[key], acc ), {})
首先,使用Array.sort() and use Array.reduce()
对数组进行排序const groceryArray = [
{ id: 'apples', groupId: 'produce', groupDisplayOrder: 1 },
{ id: 'chicken', groupId: 'meat', groupDisplayOrder: 3 },
{ id: 'shrimp', groupId: 'seafood', groupDisplayOrder: 4 },
{ id: 'milk', groupId: 'dairy', groupDisplayOrder: 2 },
{ id: 'carrots', groupId: 'produce', groupDisplayOrder: 1 },
{ id: 'salmon', groupId: 'seafood', groupDisplayOrder: 4 }
];
groceryArray.sort((a, b) => a.groupDisplayOrder - b.groupDisplayOrder);
const finalOutput = groceryArray.reduce((acc, cur) => {
if (!acc[cur.groupId]) acc[cur.groupId] = [];
acc[cur.groupId].push(cur);
return acc;
}, {});
console.log(finalOutput);
使用 Map
和 Array#reduce
您可以对数据进行分组,然后遍历所有值并对其进行排序。
const
groceryArray=[{id:"apples",groupId:"produce",groupDisplayOrder:1},{id:"chicken",groupId:"meat",groupDisplayOrder:3},{id:"shrimp",groupId:"seafood",groupDisplayOrder:4},{id:"milk",groupId:"dairy",groupDisplayOrder:2},{id:"carrots",groupId:"produce",groupDisplayOrder:1},{id:"salmon",groupId:"seafood",groupDisplayOrder:4}],
res = groceryArray.reduce((r, o) => ((r[o.groupId] ??= []), r[o.groupId].push(o), r), {});
Object.values(res).forEach((o) => o.sort(({ groupDisplayOrder: a }, { groupDisplayOrder: b }) => a - b));
console.log(res);
您可以通过使用数组和 groupDisplayOrder
以及以 groupId
作为键的对象来采用嵌套方法。
最后将所有对象组合成一个对象。
const
groceryArray = [{ id: 'apples', groupId: 'produce', groupDisplayOrder: 1 }, { id: 'chicken', groupId: 'meat', groupDisplayOrder: 3 }, { id: 'shrimp', groupId: 'seafood', groupDisplayOrder: 4 }, { id: 'milk', groupId: 'dairy', groupDisplayOrder: 2 }, { id: 'carrots', groupId: 'produce', groupDisplayOrder: 1 }, { id: 'salmon', groupId: 'seafood', groupDisplayOrder: 4 }],
result = Object.assign({}, ...groceryArray.reduce((r, o) => {
((r[o.groupDisplayOrder] ??= {})[o.groupId] ??= []).push(o);
return r;
}, []));
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }