如何转换和过滤数组

时间:2018-05-21 08:51:31

标签: javascript arrays algorithm object

我有array这样的对象:

[
  {
    latitude: 00,
    longitude: 11
  },
  {
    latitude: 22,
    longitude: 33
  },
  {
    latitude: 00,
    longitude: 11
  }, 
]

我想将该数组转换并过滤到另一个数组,该数组包含包含对象的数组:

如果经度和纬度相等,它们应该转到同一个数组,所以,我需要一个像这样的新数组:

[
  [
    {
      latitude: 00,
      longitude: 11
    },
    {
      latitude: 00,
      longitude: 11
    }
  ],
  [
    {
      latitude: 22,
      longitude: 33
    }
  ]
]

6 个答案:

答案 0 :(得分:4)

reduce到一个对象,其键代表数组对象'内容,其值为数组,并创建/推送到适当的数组:



const input=[{latitude:00,longitude:11},{latitude:22,longitude:33},{latitude:00,longitude:11},]
const output = Object.values(
  input.reduce((a, obj) => {
    const key = JSON.stringify(obj);
    if (!a[key]) a[key] = [];
    a[key].push(obj);
    return a;
  }, {})
)
console.log(output);




答案 1 :(得分:2)

我建议您在JSON对象添加更新count中添加计数字段,如果您找到相同的元素两次,否则上面的答案看起来不错。

var data = [{
        latitude: 00,
        longitude: 11
    },
    {
        latitude: 22,
        longitude: 33
    },
    {
        latitude: 00,
        longitude: 11
    },
]
var result = [];
data.forEach(val => {
    const filterIndex = result.findIndex(v => v.latitude == val.latitude && v.longitude == val.longitude);
    filterIndex == -1 ? result.push({ ...val,
        count: 1
    }) : result[filterIndex].count += 1;
});
console.log(result);

答案 2 :(得分:1)

您可以使用latitudelongitude创建唯一键,并为对象累加器中的每个唯一键推送数组中的每个对象。然后使用Object.values()提取所有值。



const data = [ { latitude: 00, longitude: 11 }, { latitude: 22, longitude: 33 }, { latitude: 00, longitude: 11 }, ],
    result = Object.values(data.reduce((r,{latitude, longitude}) => {
      const key = latitude + '_' + longitude;
      r[key] = r[key] || [];
      r[key].push({latitude, longitude});
      return r;
    },{}));
console.log(result);




答案 3 :(得分:1)

您可以将数组缩减为具有纬度和经度的对象,形成唯一键并推送与其对应的值。然后使用Object.values

返回数组

尝试以下



var arr = [ { latitude: 00, longitude: 11 }, { latitude: 22, longitude: 33 }, { latitude: 00, longitude: 11 }];

var map = arr.reduce((a,c) => {
var key = c.latitude + "_" + c.longitude;
  a[key] = a[key] || [];
  a[key].push(c);
  return a;
}, {});

console.log(Object.values(map));




供参考,Array.reduceObject.values

答案 4 :(得分:1)

这是过滤的解决方案,首先减少组中的数据,然后连接到字符串。



    var a = [{latitude:21,longitude:12},{latitude:211,longitude:2},];

    var mapped = a.reduce((acc, e) => {
        var key = '' +  e.latitude + ','+ e.longitude;
        if (!acc[key])  acc[key] = [e];
        else acc[key].push(e);	
       return acc;
    }, {});

    console.log(Object.keys(mapped).map((key) => mapped[key]));

    // edit
    console.log(Object.values(mapped));
    




答案 5 :(得分:1)

您可以使用哈希表的组合键来加速重复查找:

 const result = [], hash = {};

 for(const {latitude, longitude} of array) {
   const key = latitude + "_" + longitude;
   if(hash[key]) {
     hash[key].push({longitude, latitude});
   } else {
     result.push(hash[key] = [{longitude, latitude}]);
   }
 }