javascript如何按嵌套对象属性在顶层对对象数组进行排序

b4lqfgs4  于 2021-09-23  发布在  Java
关注(0)|答案(2)|浏览(427)
  1. var originalArray = [
  2. {
  3. name: 'Store1',
  4. inventory: [
  5. { name: 'Oranges', qt: [{ id: "something", time: 11 }, { id: "something", time: 44 }, { id: "something", time: 53 }] },
  6. { name: 'Mango', qt: [{ id: "something", time: 3 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
  7. { name: 'Kiwi', qt: [{ id: "something", time: 2 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
  8. { name: 'Papaya', qt: [{ id: "something", time: 8 }, { id: "something", time: 91 }, { id: "something", time: 3 }] }
  9. ]
  10. },
  11. {
  12. name: 'Store2',
  13. inventory: [
  14. { name: 'Pizza', qt: [{ id: "something", time: 31 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
  15. { name: 'Burger', qt: [{ id: "something", time: 1 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
  16. { name: 'IceCream', qt: [{ id: "something", time: 111 }, { id: "something", time: 11 }, { id: "something", time: 323 }] }
  17. ]
  18. }
  19. ];

例如,在上面的数组中, inventoryqt 是嵌套键,其值为对象数组。 Store2{ id: "something", time: 323 } 这是一个比任何项目都要高的时间 Store1 排序之后, Store2 将是列表中的第一个,并且 Store1 将处于第二位置,依此类推,时间递减
我的代码无法对商店进行排序。
它不应该对inventory&qt中的嵌套数组进行排序,而应该按时间降序对存储顺序进行排序

  1. const sorted = originalArray
  2. .map(store => store.inventory
  3. .map(inv => inv.qt
  4. .map(item => Object.entries(item)[1])))
  5. .sort((a, b) => b[1].time - a[1].time)
  6. .map(item => item[1])
  7. console.log(JSON.stringify(sorted));

预期产量

  1. // sorted array
  2. [
  3. {
  4. name: 'Store2',
  5. inventory: [
  6. { name: 'Pizza', qt: [{ id: "something", time: 31 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
  7. { name: 'Burger', qt: [{ id: "something", time: 1 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
  8. { name: 'IceCream', qt: [{ id: "something", time: 111 }, { id: "something", time: 11 }, { id: "something", time: 323 }] }
  9. ]
  10. },
  11. {
  12. name: 'Store1',
  13. inventory: [
  14. { name: 'Oranges', qt: [{ id: "something", time: 11 }, { id: "something", time: 44 }, { id: "something", time: 53 }] },
  15. { name: 'Mango', qt: [{ id: "something", time: 3 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
  16. { name: 'Kiwi', qt: [{ id: "something", time: 2 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
  17. { name: 'Papaya', qt: [{ id: "something", time: 8 }, { id: "something", time: 91 }, { id: "something", time: 3 }] }
  18. ]
  19. }
  20. ]
gcmastyq

gcmastyq1#

这应该起作用:

  1. const highestTime = (inventory) => {
  2. let max = 0;
  3. for (const item of inventory) {
  4. for (const obj of item.qt) {
  5. if (obj.time > max) max = obj.time;
  6. }
  7. }
  8. return max;
  9. };
  10. const sortedArray = originalArray.sort((a, b) => highestTime(b.inventory) - highestTime(a.inventory));
q43xntqr

q43xntqr2#

这不是最有效的方法,但它确实有效

  1. var originalArray = [
  2. {
  3. name: 'Store1',
  4. inventory: [
  5. { name: 'Oranges', qt: [{ id: "something", time: 11 }, { id: "something", time: 44 }, { id: "something", time: 53 }] },
  6. { name: 'Mango', qt: [{ id: "something", time: 3 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
  7. { name: 'Kiwi', qt: [{ id: "something", time: 2 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
  8. { name: 'Papaya', qt: [{ id: "something", time: 8 }, { id: "something", time: 91 }, { id: "something", time: 3 }] }
  9. ]
  10. },
  11. {
  12. name: 'Store2',
  13. inventory: [
  14. { name: 'Pizza', qt: [{ id: "something", time: 31 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
  15. { name: 'Burger', qt: [{ id: "something", time: 1 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
  16. { name: 'IceCream', qt: [{ id: "something", time: 111 }, { id: "something", time: 11 }, { id: "something", time: 323 }] }
  17. ]
  18. }
  19. ];
  20. const sorted = originalArray.slice().sort((a, b) => {
  21. maxA = Math.max(...a.inventory.flatMap(({qt})=>qt.map(({time})=>time)));
  22. maxB = Math.max(...b.inventory.flatMap(({qt})=>qt.map(({time})=>time)));
  23. return maxB-maxA
  24. });
  25. console.log(sorted);
展开查看全部

相关问题