Javascript如何通过嵌套对象属性对顶级对象数组进行排序

时间:2021-07-09 01:57:04

标签: javascript arrays sorting dictionary ecmascript-6

var originalArray = [
    {
        name: 'Store1',
        inventory: [
            { name: 'Oranges', qt: [{ id: "something", time: 11 }, { id: "something", time: 44 }, { id: "something", time: 53 }] },
            { name: 'Mango', qt: [{ id: "something", time: 3 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
            { name: 'Kiwi', qt: [{ id: "something", time: 2 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
            { name: 'Papaya', qt: [{ id: "something", time: 8 }, { id: "something", time: 91 }, { id: "something", time: 3 }] }
        ]
    },
    {
        name: 'Store2',
        inventory: [
            { name: 'Pizza', qt: [{ id: "something", time: 31 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
            { name: 'Burger', qt: [{ id: "something", time: 1 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
            { name: 'IceCream', qt: [{ id: "something", time: 111 }, { id: "something", time: 11 }, { id: "something", time: 323 }] }
        ]
    }
];

例如在上面的数组中,inventoryqt 是嵌套键,以对象数组作为其值。
Store2{ id: "something", time: 323 }Store1
中的任何项目的时间都长 排序后,Store2 排在第一位,Store1排在第二位,依此类推,时间递减

我的代码无法对商店进行排序。
它不应该对库存和 qt 中的嵌套数组进行排序,只需按时间降序对 Store order 进行排序

const sorted = originalArray
  .map(store => store.inventory
  .map(inv => inv.qt
  .map(item => Object.entries(item)[1])))
  .sort((a, b) => b[1].time - a[1].time)
  .map(item => item[1])

console.log(JSON.stringify(sorted));

预期输出

// sorted array
[
    {
        name: 'Store2',
        inventory: [
            { name: 'Pizza', qt: [{ id: "something", time: 31 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
            { name: 'Burger', qt: [{ id: "something", time: 1 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
            { name: 'IceCream', qt: [{ id: "something", time: 111 }, { id: "something", time: 11 }, { id: "something", time: 323 }] }
        ]
    },
    {
        name: 'Store1',
        inventory: [
            { name: 'Oranges', qt: [{ id: "something", time: 11 }, { id: "something", time: 44 }, { id: "something", time: 53 }] },
            { name: 'Mango', qt: [{ id: "something", time: 3 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
            { name: 'Kiwi', qt: [{ id: "something", time: 2 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
            { name: 'Papaya', qt: [{ id: "something", time: 8 }, { id: "something", time: 91 }, { id: "something", time: 3 }] }
        ]
    }
]

2 个答案:

答案 0 :(得分:1)

这不是最有效的方法,但它可以完成工作

var originalArray = [
    {
        name: 'Store1',
        inventory: [
            { name: 'Oranges', qt: [{ id: "something", time: 11 }, { id: "something", time: 44 }, { id: "something", time: 53 }] },
            { name: 'Mango', qt: [{ id: "something", time: 3 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
            { name: 'Kiwi', qt: [{ id: "something", time: 2 }, { id: "something", time: 91 }, { id: "something", time: 3 }] },
            { name: 'Papaya', qt: [{ id: "something", time: 8 }, { id: "something", time: 91 }, { id: "something", time: 3 }] }
        ]
    },
    {
        name: 'Store2',
        inventory: [
            { name: 'Pizza', qt: [{ id: "something", time: 31 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
            { name: 'Burger', qt: [{ id: "something", time: 1 }, { id: "something", time: 11 }, { id: "something", time: 23 }] },
            { name: 'IceCream', qt: [{ id: "something", time: 111 }, { id: "something", time: 11 }, { id: "something", time: 323 }] }
        ]
    }
];
const sorted = originalArray.slice().sort((a, b) => {
    maxA = Math.max(...a.inventory.flatMap(({qt})=>qt.map(({time})=>time)));
    maxB = Math.max(...b.inventory.flatMap(({qt})=>qt.map(({time})=>time)));
    return maxB-maxA
});
console.log(sorted);

答案 1 :(得分:1)

这应该有效:

const highestTime = (inventory) => {
  let max = 0;
  for (const item of inventory) {
    for (const obj of item.qt) {
      if (obj.time > max) max = obj.time;
    }
  }
  return max;
};

const sortedArray = originalArray.sort((a, b) => highestTime(b.inventory) - highestTime(a.inventory));