简体   繁体   中英

How to get the count of repeated key values of array object of consecutive elements?

I have an array structure:-

 var location = [ {
  "latitude" : 21.112,
  "longitude" : 79.07,
  "time" : "8:13AM",
  "time1" : "8:13AM"
}, 
{
  "latitude" : 21.111,
  "longitude" : 79.07,
  "time" : "8:20AM",
  "time1" : "8:20AM"
}, 
{
  "latitude" : 21.111,
  "longitude" : 79.07,
  "time" : "8:34AM",
  "time1" : "8:34AM"
}, 
{
  "latitude" : 21.111,
  "longitude" : 79.07,
  "time" : "8:41AM",
  "time1" : "8:41AM"
}, 
{
  "latitude" : 21.109,
  "longitude" : 79.07,
  "time" : "8:48AM",
  "time1" : "8:48AM"
}, 
{
  "latitude" : 21.108,
  "longitude" : 79.07,
  "time" : "8:55AM",
  "time1" : "8:55AM"
}, 
{
  "latitude" : 21.108,
  "longitude" : 79.069,
  "time" : "9:02AM",
  "time1" : "9:02AM"
}, 
{
  "latitude" : 21.107,
  "longitude" : 79.069,
  "time" : "9:09AM",
  "time1" : "9:09AM"
}, 
{
  "latitude" : 21.106,
  "longitude" : 79.069,
  "time" : "9:16AM",
  "time1" : "9:16AM"
}, 
{
  "latitude" : 21.105,
  "longitude" : 79.069,
  "time" : "9:23AM",
  "time1" : "9:23AM"
}, 
{
  "latitude" : 21.104,
  "longitude" : 79.069,
  "time" : "9:30AM",
  "time1" : "9:30AM"
}, 
{
  "latitude" : 21.105,
  "longitude" : 79.069,
  "time" : "9:37AM",
  "time1" : "9:37AM"
}, 
{
  "latitude" : 21.105,
  "longitude" : 79.07,
  "time" : "9:44AM",
  "time1" : "9:44AM"
}, 
{
  "latitude" : 21.105,
  "longitude" : 79.071,
  "time" : "9:51AM",
  "time1" : "9:51AM"
}, 
{
  "latitude" : 21.106,
  "longitude" : 79.072,
  "time" : "9:58AM",
  "time1" : "9:58AM"
}]

I want the count of no. of times latitude and longitude are the same in each object. It should return the array as it is just with the additional count key. For eg- Expected Result

var location = [ {
  "latitude" : 21.112,
  "longitude" : 79.07,
  "time" : "8:13AM",
  "time1" : "8:13AM",
  "count":1
}, 
{
  "latitude" : 21.111,
  "longitude" : 79.07,
  "time" : "8:20AM",
  "time1" : "8:20AM",
  "count":3
}, 
{
  "latitude" : 21.111,
  "longitude" : 79.07,
  "time" : "8:34AM",
  "time1" : "8:34AM",
  "count":3
}, 
{
  "latitude" : 21.111,
  "longitude" : 79.07,
  "time" : "8:41AM",
  "time1" : "8:41AM",
  "count":3
},..]

I have tried this code-

const resultarray = Object.values(location.reduce((a, b) => {
  a[b.latitude + b.longitude] = Object.assign(b, {count: (a[b.latitude + b.longitude] || {count: 0}).count + 1});
  return a;
}, {}));

console.log(resultarray)

But this returns unique objects of elements with count. I want each object as it is with the key count.

You could take an object for counting the occurences and map the count to the same positions.

 const getKey = o => ['latitude', 'longitude'].map(k => o[k]).join('|'), locations = [{ latitude: 21.112, longitude: 79.07, time: "8:13AM", time1: "8:13AM" }, { latitude: 21.111, longitude: 79.07, time: "8:20AM", time1: "8:20AM" }, { latitude: 21.111, longitude: 79.07, time: "8:34AM", time1: "8:34AM" }, { latitude: 21.111, longitude: 79.07, time: "8:41AM", time1: "8:41AM" }, { latitude: 21.109, longitude: 79.07, time: "8:48AM", time1: "8:48AM" }, { latitude: 21.108, longitude: 79.07, time: "8:55AM", time1: "8:55AM" }, { latitude: 21.108, longitude: 79.069, time: "9:02AM", time1: "9:02AM" }, { latitude: 21.107, longitude: 79.069, time: "9:09AM", time1: "9:09AM" }, { latitude: 21.106, longitude: 79.069, time: "9:16AM", time1: "9:16AM" }, { latitude: 21.105, longitude: 79.069, time: "9:23AM", time1: "9:23AM" }, { latitude: 21.104, longitude: 79.069, time: "9:30AM", time1: "9:30AM" }, { latitude: 21.105, longitude: 79.069, time: "9:37AM", time1: "9:37AM" }, { latitude: 21.105, longitude: 79.07, time: "9:44AM", time1: "9:44AM" }, { latitude: 21.105, longitude: 79.071, time: "9:51AM", time1: "9:51AM" }, { latitude: 21.106, longitude: 79.072, time: "9:58AM", time1: "9:58AM" }], counts = locations.reduce((r, o) => { const key = getKey(o); r[key] = (r[key] || 0) + 1; return r; }, {}), result = locations.map(o => ({... o, count: counts[getKey(o)] })); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM