【问题标题】:Remove elements from JSON with duplicate array members in JavaScript从 JSON 中删除 JavaScript 中具有重复数组成员的元素
【发布时间】:2016-07-20 07:57:33
【问题描述】:

有没有一种简单的方法可以删除带有重复“数组成员”的 JSON 元素?

这是我的 JSON 对象示例:

{
"temperature": [
  {"datetime":"2011-01-27T11:40:50.000Z", "value":15},
  {"datetime":"2011-01-27T11:40:50.000Z", "value":16}, <-- this one should be removed
  {"datetime":"2011-01-27T11:41:00.000Z", "value":14},
  {"datetime":"2011-01-27T11:41:10.000Z", "value":15},
  {"datetime":"2011-01-27T11:41:10.000Z", "value":15}, <-- this one should be removed
  {"datetime":"2011-01-27T11:41:10.000Z", "value":14}, <-- this one should be removed
  {"datetime":"2011-01-27T11:41:20.000Z", "value":16}
  ]
}

对于我的示例,如果“日期时间”与其他 JSON 数组中的任何其他“日期时间”重复,我想删除整个 JSON 数组。

我尝试过这样做,但它给了我看似相反的结果:

var datetimes = [];
for(var i = 0; i < obj.temperature.length; i++) {
  if($.inArray(obj.temperature[i].datetime, datetimes)) {
    obj.temperature.splice(i,1);
  }else {
    datetimes.push(obj.temperature[i].datetime);
  }
}

试试here

【问题讨论】:

    标签: javascript jquery arrays json duplicates


    【解决方案1】:

    您可以稍微作弊,将项目作为属性添加到对象中,并将日期作为属性键。这使它独一无二,然后您所要做的就是从属性值重新创建数组。像这样的:

    var dict={}
    obj.temperature.forEach(function(t) {
      dict[t.datetime]=t;
    });
    var arr=[];
    for(var datetime in dict) {
      arr.push(dict[datetime]);
    }
    

    在这里提琴:https://jsfiddle.net/cmfanjox/

    【讨论】:

    • 你能提供一个工作的jsfiddle吗?我无法让它工作。
    • 抱歉,您的对象也被命名为 obj。现在它应该可以工作了。
    • 它现在几乎可以完美运行,但是它会选择最后一项而不是第一项:jsfiddle.net/ra48f46c/2
    • 非常感谢,它现在可以工作了,尽管我的错误似乎是我应该将 i 设置为 1 而不是 0。我必须将性能速度与您的解决方案和 Lea 进行比较福克斯的。我会将最快的一个标记为我猜的最佳答案。
    • 好的,我已经用更多数据进一步测试了这一点,最终您的解决方案是唯一一个始终如一的解决方案。感谢您的帮助!
    【解决方案2】:

    var i = 1

    你从零开始问,这里是 x 对象吗?它是什么。所以,它被拼接起来。当您到达要删除的输入时,您已经拼接出了所有要保留的输入。

    var datetimes = [];
    for(var i = 1; i < obj.temperature.length; i++) {
      if($.inArray(obj.temperature[i].datetime, datetimes)) {
        obj.temperature.splice(i,1);
      }else {
        datetimes.push(obj.temperature[i].datetime);
      }
    }
    

    【讨论】:

      【解决方案3】:

      看看这个sn-p:

      var items = [{
        "datetime": "2011-01-27T11:40:50.000Z",
        "value": 15
      }, {
        "datetime": "2011-01-27T11:40:50.000Z",
        "value": 16
      }, {
        "datetime": "2011-01-27T11:41:00.000Z",
        "value": 14
      }, {
        "datetime": "2011-01-27T11:41:10.000Z",
        "value": 15
      }, {
        "datetime": "2011-01-27T11:41:10.000Z",
        "value": 15
      }, {
        "datetime": "2011-01-27T11:41:10.000Z",
        "value": 14
      }, {
        "datetime": "2011-01-27T11:41:20.000Z",
        "value": 16
      }];
      
      var dedup = items.reduce(function(a, b) {
        function indexOfProperty(a, b) {
          for (var i = 0; i < a.length; i++) {
            if (a[i].value == b.value && a[i].datetime == b.datetime) {
              return i;
            }
          }
          return -1;
        }
      
        if (indexOfProperty(a, b) < 0) a.push(b);
        return a;
      }, []);
      

      【讨论】:

        【解决方案4】:

        嗯,有一个不使用 jQuery 的简单解决方案:

        var obj = {
        "temperature": [
          {"datetime":"2011-01-27T11:40:50.000Z", "value":15},
          {"datetime":"2011-01-27T11:40:50.000Z", "value":16},
          {"datetime":"2011-01-27T11:41:00.000Z", "value":14},
          {"datetime":"2011-01-27T11:41:10.000Z", "value":15},
          {"datetime":"2011-01-27T11:41:10.000Z", "value":15},
          {"datetime":"2011-01-27T11:41:10.000Z", "value":14},  
          {"datetime":"2011-01-27T11:41:20.000Z", "value":16}
         ]
        };
        
        var temp = [];
        
        for (var i = 0; i < obj.temperature.length; i++) {
            if (temp.indexOf(obj.temperature[i].datetime) === -1) {
                temp.push(obj.temperature[i].datetime);
                obj.temperature.splice(i + 1, 1)
            };
        };
        
        console.log(obj);
        

        【讨论】:

          猜你喜欢
          • 2017-03-21
          • 2011-04-29
          • 2011-08-17
          • 2019-03-23
          • 2020-05-08
          • 2013-05-20
          • 2011-07-03
          • 1970-01-01
          相关资源
          最近更新 更多