Typescript-根据多个值对数组中的对象进行分组和过滤

时间:2018-09-03 15:51:46

标签: javascript reactjs typescript

假设我们有一个类似的数组:

[
  {
    id: 0,
    name: 'A'
    longitude: 10
    latitude: 12
  },
  {
    id: 1,
    name:'B'
    longitude: 10
    latitude: 12
  },
  {
    id: 2,
    name: 'C'
    longitude: 11
    latitude: 10
  },
  {
    id: 3,
    name: 'D'
    longitude: 11
    latitude: 15
  }
]

我想获得一个具有相同经度和纬度的对象数组:

[
  [
    {
      id: 0,
      name: 'A'
      longitude: 10
      latitude: 12
    },
    {
      id: 1,
      name:'B'
      longitude: 10
      latitude: 12
    }
  ]
]

唯一想到的方法是遍历数组以获取坐标和那里的对象数,然后如果长度大于1,则为每个坐标获取一个子数组,但过程非常复杂。我在redux react应用中使用了它,它是在每次状态更改后重新渲染之前计算的。

是否有更有效的方法?我想将经纬度相同的那些分组。

1 个答案:

答案 0 :(得分:1)

您可以按longitudelatitude对数据进行排序。接下来,您需要遍历数据并将匹配的对象推送到一个临时数组,如下所示。最后,您可以返回您的临时数组。

const arr = [{
        id: 0,
        name: 'A',
        longitude: 10,
        latitude: 12,
    },

    {
        id: 2,
        name: 'C',
        longitude: 11,
        latitude: 10,
    },
    {
        id: 3,
        name: 'D',
        longitude: 11,
        latitude: 15,
    },
        {
        id: 1,
        name: 'B',
        longitude: 10,
        latitude: 12
    }
];

function cleanData(data) {
	data.sort(function (a, b) {
    return a.longitude - b.longitude  || a.latitude - b.latitude;
	});
    let tempArr = [];
    for (let i = data.length - 1; i >=1 ; i--) {
        if (data[i].hasOwnProperty('longitude')) {
                if (data[i].longitude === data[i - 1].longitude &&
                    data[i].latitude === data[i - 1].latitude) {
                    tempArr.push(data[i], data[i - 1]);
                }
                
            } else {
            	return;
            }
        
        }
        console.log([...[tempArr]]);
    }

cleanData(arr);