【问题标题】:Get unique value count from array of objects从对象数组中获取唯一值计数
【发布时间】:2020-11-13 02:09:37
【问题描述】:

我有 javascript array 并且我想在此回复中获得 count 键。

回复如下:

var events = [
  {
    "success": true,
    "data": {
      "events": [
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 675,
          "isSelected": false
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 690,
          "isSelected": false
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 690,
          "isSelected": true
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 705,
          "isSelected": false
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 705,
          "isSelected": true
        }
      ]
    },
    "message": "Data found"
  }
]

我想要这样的数组响应:

var events = [
  {
    "success": true,
    "data": {
      "events": [
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 675,
          "isSelected": false,
          "count": 1
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 690,
          "isSelected": true,
          "count": 2
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 705,
          "isSelected": true,
          "count": 2
        }
      ]
    },
    "message": "Data found"
  }
]

我需要添加count 键并计算相同startTime 值出现的次数,并根据startTime 删除重复的object。请帮帮我。

【问题讨论】:

  • 如果startTime 相同,是否所有其他字段都必须相同?我的意思是,如果startTime 相同但dayOfWeek 不同,那么它也将被删除
  • @AbhishekKumarTiwari 是的

标签: javascript node.js arrays sorting


【解决方案1】:

只需减少子数组并像这样计算出现次数:

var events = [
  {
    "success": true,
    "data": {
      "events": [
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 675,
          "isSelected": false
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 690,
          "isSelected": false
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 690,
          "isSelected": true
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 705,
          "isSelected": false
        },
        {
          "date": "2020-08-24T00:00:00.000Z",
          "dayOfWeek": 1,
          "startTime": 705,
          "isSelected": true
        }
      ]
    },
    "message": "Data found"
  }
];

events = events.map(e => {
  e['data']['events'] = e['data']['events'].reduce((acc, ev) => {
    const index = acc.findIndex(existingEv => existingEv['startTime'] == ev['startTime']);
    
    if(index != -1) {
      acc[index]['count'] = acc[index]['count'] + 1;
      acc[index]['isSelected'] = acc[index]['isSelected'] || ev['isSelected'];
    } else {
      acc.push({
        ...ev,
        count: 1
      });
    }
    
    return acc;
  }, []);
  return e;
});

console.log(events);

【讨论】:

  • 我已经检查了你的答案,但我需要 isSelectedtrue。用回复检查我的问题。
【解决方案2】:

使用 Array.filter():

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

const _events_ = [];
const eventsNonDuplicated = events[0].data.events.filter((ev) => {
   if (!_events_.some((v) => v == ev.startTime) ) {
     _events_.push(ev.startTime);
      return ev;
   }
});
console.log(eventsNonDuplicated);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2019-11-14
    • 2019-01-03
    • 2021-10-30
    • 1970-01-01
    • 2022-01-10
    相关资源
    最近更新 更多