【问题标题】:Array, change the values of objects that have equal properties数组,改变具有相同属性的对象的值
【发布时间】:2018-09-20 03:32:32
【问题描述】:

我有一个数组,这个数组包含有属性的对象,例如: {名称、纬度、经度}。

如果两个对象的 lat 和 lng 值相同,我必须这样做,那么我必须只在第二个对象中修改 lat 和 lng 的值,总之我必须添加一个非常小数值,因此它们是不同的。

数组示例:

var array = [
  {
   "id": "269849444",
   "name": "Ziano Piacentino",
   "lat": 45,
   "lng": 9.4,
  },
  {
   "id": "649296407",
   "name": "Monte Bondone",
   "lat": 46.0315,
   "lng": 11.05685,
  },
  {
   "id": "300151628",
   "name": "Cima Calisio",
   "lat": 46.0977158258,
   "lng": 11.1443512052,
  },
  {
   "id": "266239592",
   "name": "Trient, Trentino-Alto Adige, Italy",
   "lat": 46.0667,
   "lng": 11.1333,
  },
  {
   "id": "130313194355778",
   "name": "Monte Celva",
   "lat": 46.0695882,
   "lng": 11.1783065,
  },
  {
   "id": "217942785",
   "name": "Trento, Italy",
   "lat": 46.0667,
   "lng": 11.1333,
  },
  {
   "id": "478657266",
   "name": "Mercatino di Natale a Levico Terme città da amare",
   "lat": 46.0099217576,
   "lng": 11.3052625593,
  },
  {
   "id": "288554028181059",
   "name": "Fontana Del Nettuno, Trento",
   "lat": 46.0675553413,
   "lng": 11.1213752236,
  },
  {
   "id": "252747884",
   "name": "Duomo di Milano - Milan Cathedral",
   "lat": 45.4646680426,
   "lng": 9.1904055604,
  },
  {
   "id": "213183830",
   "name": "Piacenza",
   "lat": 45.0167,
   "lng": 9.66667,
  },
    {
   "id": "213183830",
   "name": "Home",
   "lat": 45.0167,
   "lng": 9.66667,
  }
 ];

有什么建议吗? 即使我认为唯一的解决方案是使用双精度。

【问题讨论】:

  • 尝试做一些工作,编写自己的代码并展示它。例如,您可以从第二个循环上的循环开始以比较 lat 和 lng。
  • 浮点数通常不一样。

标签: javascript arrays object functional-programming reduce


【解决方案1】:

试试这个:

var array = [...];

array.forEach(function(obj1, key1){
  var increment = 0.000001;
  array.forEach(function(obj2, key2){
    if (key1 != key2){
      if(obj1.lat == obj2.lat && obj1.lng == obj2.lng){
        array[key2].lat += increment;
        array[key2].lng += increment;
        increment += 0.000001;
      }
    }
  });
});

【讨论】:

  • 谢谢,为什么要更改解决方案? a.forEach((o,k) => { a.forEach ((u,q) => { if (k!=q) { if (o.lat == u.lat && o.lng == u. lng) { a[q].lat + = 0.000001; a[q].lng + = 0.000001; return false; } }});});
  • 每次重复骰子时,此更改都会增加。第一个解决方案仅适用于 2 个重复值,但当前解决方案可用于 2,3,4,5,... 重复值。
【解决方案2】:

用代码解决问题的步骤是:

  • 了解问题
  • 了解您需要做些什么来解决它
  • 用伪代码计划一下
  • 代码

恭喜,前两步完成。第三个我可以帮忙,你会为第四个做好准备!


最基本的方法是有两个循环,在其中搜索数组中的每一项,直到找到符合条件的一项并执行您需要执行的操作。

以下不是实际的代码语法,是伪代码。一种让您更深入地了解解决问题的方法。

var array = {...}    
for elementA in array {
   for elementB in array{
       //First you have to make sure you are not comparing the same value in the array with itself
       if elementA.index is different from elementB.index then {
            if elementA equals elementB {
                change elementB
             }
       }
   }
}

因此,您在此伪代码中所做的就是从数组中获取一个元素,并将其与同一数组中的所有其他项进行匹配。您必须小心不要尝试与自身匹配,避免这种情况的一种方法是比较项目的索引位置,如果它们不同,您可以很确定它不是同一个项目。一旦你通过了这个障碍,你所要做的就是询问它们是否相同(在你的情况下,特别是它们是否具有相同的 latlng 值)。如果是,那么您所要做的就是更改elementB,这是比较的第二个元素。

就是这样!

希望能帮助您走上正确的道路。如果您提供一些解决问题的方法,而不是要求原始答案,您可以从 StackOverflow 中获得更多收益。

【讨论】:

  • 其实我只是想要一个意见,但似乎那部分消息被取消了,我不明白为什么。感谢您的留言,我认为唯一的解决方案是使用 double for。 ;)
  • 最好以不同的方式表达您的问题。沿着“除了两个循环之外还有其他方法可以做到这一点吗?”并提供您的第一种方法。也许下次:)
猜你喜欢
  • 1970-01-01
  • 2022-07-03
  • 2015-06-30
  • 1970-01-01
  • 2013-10-14
  • 2019-06-05
  • 2012-06-27
  • 1970-01-01
相关资源
最近更新 更多