我有这个算法问题,我想在添加它之前检查我的数组中是否已存在对象。
我尝试了很多不同的方法(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);
}
});
});
答案 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
- 你正在推动。