删除angularjs中的重复数组项

Posted

技术标签:

【中文标题】删除angularjs中的重复数组项【英文标题】:Removing duplicate array items in angularjs 【发布时间】:2017-07-11 21:17:21 【问题描述】:

我有一个 websocket 连接,可以在 angularjs 中提取 json 数据。基本思想是代码:数组中的5项是问题,数组中的代码:6项是删除问题的请求。

收到的第一个 jSON 数据如下所示:

["code":1,"timestamp":"2017-07-11T21:00:16.655706556Z","text":"Welcome to the listening pool, total clients 1","uuid":"51c7d6c7-8b6a-4b39-a460-343480e6cd23","code":5,"timestamp":"2017-07-11T21:00:18.736695286Z","text":"By trying we can easily learn to endure adversity.  Another man's, I mean.\n\t\t-- Mark Twain\n","uuid":"9046a275-ada8-415a-9dd3-37bdbfc43f75"]

code:5 项目随后将发布到问题队列中的页面。 websocket 的第二次更新将包括一个代码:6 以删除已发布的问题(代码:5)。我正在使用 uuid 值来查找匹配项并删除问题。

["code":1,"timestamp":"2017-07-11T21:00:16.655706556Z","text":"Welcome to the listening pool, total clients 1","uuid":"51c7d6c7-8b6a-4b39-a460-343480e6cd23","code":5,"timestamp":"2017-07-11T21:00:18.736695286Z","text":"By trying we can easily learn to endure adversity.  Another man's, I mean.\n\t\t-- Mark Twain\n","uuid":"9046a275-ada8-415a-9dd3-37bdbfc43f75","code":6,"timestamp":"2017-07-11T21:00:23.870193214Z","uuid":"9046a275-ada8-415a-9dd3-37bdbfc43f75"]

我遇到的问题是它只删除了第一个副本。当从 Web 套接字接收到更多数据时,它会将已删除的旧数据重新放入。

任何帮助将不胜感激。

这是我的角码:

  <section ng-controller="WaitingRoom">
    <ul ng-repeat="data in MyData.collection | orderBy: '-timestamp' track by $index" ng-show="data.code == 5 && data.uuid != MyData.collection[$index].uuid">
      <li id="code"> Code:  data.code </li>
      <li> Timestamp:  data.timestamp | date:'medium' </li>
      <li> Question:  data.text </li>
      <li id="uuid"> ID:  data.uuid </li>
    </ul>
  </section>

angular.module('MY_APP', ['ngWebSocket'])
//                      
.factory('MyData', function($websocket) 
  // Open a WebSocket connection
  var dataStream = $websocket('ws://website.com/data');

  var collection = [];

  dataStream.onMessage(function(message) 
    collection.push(JSON.parse(message.data));
  );

  var methods = 
    collection: collection,
    get: function() 
      dataStream.send(JSON.stringify( action: 'get' ));
    
  ;

  return methods;
)
.controller('WaitingRoom', function ($scope, MyData) 
  $scope.MyData = MyData;
);

【问题讨论】:

您可以在collection.push(JSON.parse(message.data)); 行之前添加一个检查来检查uuid 是否已经在集合中?如果没有,那么添加它。否则 - 忽略、替换或删除该项目。 【参考方案1】:

您可以在 angularjs 中使用名为 unique 的过滤器。

示例如下:

ng-repeat="data in array | unique:fieldName"
data 

【讨论】:

我尝试了独特的过滤器,但仍然显示重复项目中的一个。我使用了 Ng-show 过滤器,它第一次使用它从 websocket 获取数据,然后将其放回第二次更新 能否分享一下下面的数据结构 上面的原帖中有两个数据结构示例。如果您还需要其他东西,请告诉我。【参考方案2】:

如果您不介意使用 Underscore.js 之类的东西,它可以从数组中删除重复项。

也许这会让你感兴趣:https://***.com/a/11478378/2660180

【讨论】:

【参考方案3】:

我想我得到了它的工作。不确定这是否是最好的方法,但它似乎正在工作。任何有关清理或更好解决方案的建议将不胜感激。

dataStream.onMessage(function(message) 
       var data = collection.push(JSON.parse(message.data)); 
       var data = (JSON.stringify(collection));


       var data = Object(collection);

        for (var i = 0; i < data.length; i++) 
              var uuid1 = collection[i].uuid;
              // console.log(uuid1);

                for (var j = 0; j < data.length; j++) 

                  var uuid2 = collection[j].uuid;
                  // console.log(uuid2);

                    if (i !=j)

                        if (uuid1 == uuid2)
                          console.log("Duplicate found: " + uuid1);
                          collection.splice(i);
                          collection.splice(j);
                        
                        else console.log("No Duplicates");
                      
                
        


      );

【讨论】:

以上是关于删除angularjs中的重复数组项的主要内容,如果未能解决你的问题,请参考以下文章

使用 push() 方法和 indexOf() 方法从 AngularJS1 中的数组中删除/检查重复的日期

AngularJS / JavaScript Splice - 总是从数组中删除第一个或最后一个项目

从 GeoFire 对象数组中删除重复项 [重复]

使用Angular语法删除数组中的对象[重复]

leetcode-26.删除重复数组中的重复项

删除有序数组中的重复项--力扣