【问题标题】:How can I filter an array of objects with one duplicate key and another unique key [duplicate]如何使用一个重复键和另一个唯一键过滤一组对象[重复]
【发布时间】:2021-03-31 00:31:09
【问题描述】:

我有一个对象数组,比如

const data = [
{date: "2020-12-21", time: "09:10:00"},
{date: "2020-12-21", time: "09:20:00"},
{date: "2020-12-21", time: "09:30:00"},
{date: "2020-12-22", time: "12:50:00"},
{date: "2020-12-22", time: "13:00:00"},
{date: "2020-12-22", time: "13:10:00"},
{date: "2020-12-22", time: "13:20:00"},
{date: "2020-12-23", time: "10:40:00"},
{date: "2020-12-23", time: "10:50:00"},
{date: "2020-12-23", time: "11:00:00"},

]

我正在尝试使用 javascript 获得以下过滤结果。有人可以帮我吗?

data = [
    {date: "2020-12-21", time: ["09:10:00", "09:20:00","09:30:00" ]},
    {date: "2020-12-22", time: ["12:50:00", "13:00:00","13:10:00" ]},
    {date: "2020-12-23", time: ["10:40:00","10:50:00","11:00:00" ]},
    ]

【问题讨论】:

    标签: javascript arrays json object filter


    【解决方案1】:

    const data = [
      {date: "2020-12-21", time: "09:10:00"},
      {date: "2020-12-21", time: "09:20:00"},
      {date: "2020-12-21", time: "09:30:00"},
      {date: "2020-12-22", time: "12:50:00"},
      {date: "2020-12-22", time: "13:00:00"},
      {date: "2020-12-22", time: "13:10:00"},
      {date: "2020-12-22", time: "13:20:00"},
      {date: "2020-12-23", time: "10:40:00"},
      {date: "2020-12-23", time: "10:50:00"},
      {date: "2020-12-23", time: "11:00:00"},
    ]
    
    const output = data.reduce((acc, cur) => {
      if (!acc[cur.date]) acc[cur.date] = {
        date: cur.date,
        time: []
      };
      acc[cur.date].time.push(cur.time);
      return acc;
    }, {});
    
    const result = Object.values(output)
    
    console.log(result);

    【讨论】:

      【解决方案2】:

      你可以使用reduce来实现,

      const data = [
      {date: "2020-12-21", time: "09:10:00"},
      {date: "2020-12-21", time: "09:20:00"},
      {date: "2020-12-21", time: "09:30:00"},
      {date: "2020-12-22", time: "12:50:00"},
      {date: "2020-12-22", time: "13:00:00"},
      {date: "2020-12-22", time: "13:10:00"},
      {date: "2020-12-22", time: "13:20:00"},
      {date: "2020-12-23", time: "10:40:00"},
      {date: "2020-12-23", time: "10:50:00"},
      {date: "2020-12-23", time: "11:00:00"},
      
      ]
      
      let res = data.reduce((acc, curr) => {
        let index = acc.findIndex(item => item.date === curr.date);
        if(index > -1) {
          acc[index].time.push(curr.time);
        }
        else acc.push({date: curr.date, time: [curr.time]});
        return acc;
      }, [])
      
      console.log(res);

      【讨论】:

      • findIndex inside reduce() 方法在循环内发生循环,因此o-notation 性能将是O(n*n)。最好不要在 reduce 中使用 findIndex。
      • 这行得通。谢谢。
      猜你喜欢
      • 2019-08-20
      • 2016-12-30
      • 2022-12-03
      • 2022-01-16
      • 2014-01-12
      • 1970-01-01
      • 2020-10-17
      • 2023-02-03
      • 1970-01-01
      相关资源
      最近更新 更多