JavaScript - 有条件地查找和删除重复项

时间:2017-09-06 20:25:20

标签: javascript arrays

目前我从设备获取坐标(lat,long)并将它们存储在一个数组中,如下所示:

 [35.23223,-5.293222]

但是,有几次这些坐标会重复(也许设备会发送相同的坐标等等)。

为此,我实施了以下内容:

 var uniqueCoords = [Array.from(new Set(coords))];

在每个调用中,挖掘现有数组并删除任何重复的坐标。

然而,这会引起严重的问题,特别是在(例如)新的纬度和旧的经度(即[35.23223,-5.319399])或反之亦然时。

在这个特定的示例uniqueCoords中,我会深入了解35.23223重复并删除的数组,并且在旅程结束时它会单独留下-5.319399它可能会结束:

[35.23223,-5.293222,-5.319399]

我想要的是仅在两者同时移除(纬度/长度) lat& long ,与数组中已存在的对完全相同。

当前代码:

    this.storage.get('route').then((route) => {

    let uniqueCoords: any = [Array.from(new Set(route))];

      uniqueCoords.push(latLng.lat, latLng.lng);
      this.storage.set('routeTaken', uniqueCoords); 

  }).catch((error) => {
    this.presentAlert(error)
  })

原始数据数组:

   [35.7790733,-5.8453983,35.779335,-5.8465283,35.779705,-5.84782,35.7787533,-5.8482083,35.7780167,-5.8491983,35.77782,-5.8504883,35.7774783,-5.8518267,35.776955,-5.852945,35.7765,-5.8541383,35.7761667,-5.855425,-5.8566467,35.77628,-5.8579367,35.7763233,-5.8588633,35.776435,-5.8591367,35.7767667,-5.8594817,35.7776267,-5.8586933,35.7785467,-5.8577233,-5.8585467,35.77949,-5.8597567,35.7797183,-5.86081,35.7805917,-5.8606533,35.7817533,-5.8606867,35.7826217,-5.8618667,35.78295,-5.8636367,35.7834217,-5.8643667]

5 个答案:

答案 0 :(得分:2)

您可以加入坐标并在进行独特后拆分它们。

var coordinates = [[35.23223, -5.293222], [35.23223, -5.319399], [35.23223, -5.319399]],
    unique = Array.from(new Set(coordinates.map(a => a.join('|'))), s => s.split('|').map(Number));
    
console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果你取一个点的数组,比如[35.23223, -5.293222],你就会在一个点上插入一个对象。具有相同坐标的另一个pont生成一个新对象,该对象不等于前一个数组。为了使两者相等,你需要对数组进行一些串联。这可以是JSON字符串,或者更简单,例如与分隔符连接。

与单个数组中的连续坐标相同。

var coordinates = [35.23223, -5.293222, 35.23223, -5.319399, 35.23223, -5.319399],
    unique = Array.from(new Set(coordinates
        .reduce((r, a, i) => (i % 2 ? r[r.length - 1].push(a) : r.push([a]), r), [])
        .map(a => a.join('|'))), s => s.split('|').map(Number));
    
console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

假设<ngContent></ngContent>的格式为uniqueCoords[lat,long,lat,long,...]的格式与new Set类似

[lat, long]

答案 2 :(得分:0)

如果您只是切换到['lat,lng', ...]的格式(作为字符串),您的代码将正常工作。

但是你应该在添加新的坐标后检查重复项。目前你在之前

答案 3 :(得分:0)

这是一个非常合乎逻辑的,一步一步的,没有花哨的方式来做这件事

&#13;
&#13;
var coords = [
  35.7790733, -5.8453983,
  35.779335,  -5.8465283,
  35.7790733, -5.8453983,
  35.779705,  -5.84782
];
var temp = [];
var unique = [];
var uniqueCoords = [];

for (var i = 0; i < coords.length; i += 2) {
  temp.push(coords[i] + '---' + coords[i + 1]); // create some strings
}

for (var i = 0; i < temp.length; i++) {
  if (unique.indexOf(temp[i]) === -1)           // remove duplicates
    unique.push(temp[i]);
}

for (var i = 0; i < unique.length; i++) {       // split the strings back into array
  uniqueCoords = uniqueCoords.concat(unique[i].split('---')); 
}

console.log(uniqueCoords)
&#13;
&#13;
&#13;

答案 4 :(得分:0)

   this.storage.get('route').then((route) => {

if (route.length < 2 || route[route.length - 2] != latLng.lat || route[route.length - 1] != latLng.lng) {
      uniqueCoords.push(latLng.lat, latLng.lng);
      this.storage.set('routeTaken', uniqueCoords); 
}

  }).catch((error) => {
    this.presentAlert(error)
  })