如何在添加对象之前检查对象是否已存在?

时间:2017-05-09 13:13:20

标签: javascript angularjs arrays

我有这个算法问题,我想在添加它之前检查我的数组中是否已存在对象

我尝试了很多不同的方法(indexOf,filter ...),我最后的尝试是使用angular.foreach。

问题是我的$ scope.newJoin始终是空的。我理解为什么,这是因为if是永远不会被读取的,因为我的$ scope.newJoin的0大小,但我不知道如何解决这个...

$ scope.newJoinTMP 由以下内容组成:6个对象,每个 timePosted 属性(用于比较这些不同的数组对象)。

$ scope.newJoin 是一个空数组。我想用 $ scope.newJoinTMP 中的对象填充它,但确定每个对象有一次,而不是两次相同($ scope.newJoinTMP可以有重复项)里面的对象,但$ scope.newJoin不能)。

                    angular.forEach($scope.newJoinTMP, function(item) 
                    { 
                       
                        angular.forEach($scope.newJoin, function(item2)
                        {
                            if (item.timePosted === item2.timePosted) 
                            {
                                //snap.val().splice(snap.val().pop(item));
                                console.log("pop");
                            }
                            else
                            {
                                $scope.newJoin.push(item);
                                console.log("newJoin :", $scope.newJoin);
                            }
                        });
                    });

4 个答案:

答案 0 :(得分:1)

if(!$scope.newJoin.find(el=>item.timePosted===el.timePosted){      
      $scope.newJoin.push(item);
      console.log("newJoin :", $scope.newJoin);
}

你不想推进forEach,因为它会推多次......

答案 1 :(得分:1)

可能有更好的方法来处理您的特定情况,但这是针对您的特定代码的修复程序。 将每个元素的内部替换为元素的存在并通过该布尔值返回布尔值,决定是否添加元素

                angular.forEach($scope.newJoinTMP, function(item) 
                { 

                    var isItemPresent = $scope.newJoin.some(function(item2)
                    {
                        return item.timePosted === item2.timePosted;
                        //you dont need this conditional handling for each iteration.
                       /* if (item.timePosted === item2.timePosted) 
                        {
                            //snap.val().splice(snap.val().pop(item));
                            console.log("pop");
                        }
                        else
                        {
                            $scope.newJoin.push(item);
                            console.log("newJoin :", $scope.newJoin);
                        } */
                    });
                    if( ! isItemPresent ) {
                       $scope.newJoin.push(item);
                    } else {
                       //do if it was present.
                    }
                });

答案 2 :(得分:1)

如果要避免嵌套循环(forEach,some,indexOf或其他),可以使用辅助对象。它将使用更多内存,但您将花费更少的时间。

let arr = [{ id: 0 }, { id:0 }, { id: 1}];
let aux = {};

const result = arr.reduce((result, el) => {
  if (aux[el.id] === undefined) {
    aux[el.id] = null;
    return [el, ...result];
  } else {
    return result;
  }
}, []);

console.log(result);

答案 3 :(得分:0)

您可以使用reduce

$scope.newJoin = $scope.newJoinTMP.reduce(function(c, o, i) {
    var contains = c.some(function(obj) {
        return obj.timePosted == o.timePosted;
    });

    if (!contains) {
        c.push(o);
    }

    return c;
}, []);

当前代码的问题是,如果newJoin为空,则不会添加任何内容 - 如果它不为空,如果第一次迭代不匹配正在迭代的当前项目newJoinTMP - 你正在推动。