从对象数组获取唯一值计数

时间:2020-07-23 11:03:10

标签: javascript node.js arrays sorting

我有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值的次数,并根据object删除重复的startTime。请帮助我。

2 个答案:

答案 0 :(得分:0)

只需减少子数组并计算出现次数,如下所示:

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);

答案 1 :(得分:0)

使用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);