我有这个json对象有seq 1,2,3,4。在主HTML页面中,用户可以编辑seq编号,我需要确保每个seq都是唯一的,不得像2套" 1"那样重复。 &安培; " 1&#34 ;. 不幸的是,这是有缺陷的,有时它有时不工作。 有人可以指出我的错误吗?我也想忽略空白值
$scope.myDataset.map(v => v.seq).sort().sort((a, b) => {
if (a !== '' && b !== '' && a === b) {
$scope.duplicateFound = true
}
})
$scope.myDataset = [
{ seq: '1', },
{ seq: '2', },
{ seq: '3', },
{ seq: '4', },
{ seq: '', },
{ seq: '', },
];
答案 0 :(得分:0)
以下代码可能对您有所帮助:
$scope.myDataset = [
{ seq: '1', },
{ seq: '2', },
{ seq: '3', },
{ seq: '4', },
];
var dataSeq = $scope.myDataset.map(v => v.seq);
dataSeq.forEach(function (item, index) {
if (item !== '' && dataSeq.indexOf(item) !== index ) {
$scope.duplicateFound = true;
break;
}
})
答案 1 :(得分:0)
以下是使用Set
和array#some
var myDataset = [
{ seq: '1', },
{ seq: '2', },
{ seq: '3', },
{ seq: '4', },
];
var visited = new Set();
var hasDuplicates = myDataset.some(function(obj) {
return visited.size === visited.add(obj.seq).size;
});
console.log(Array.from(visited));
console.log(hasDuplicates);
答案 2 :(得分:0)
您可以将对象用作哈希表并排除空字符串。
function hasDupes(array) {
var hash = Object.create(null);
return array.some(function (a) {
return a.seq && (hash[a.seq] || !(hash[a.seq] = true));
});
}
// false
console.log(hasDupes([{ seq: '4' }, { seq: '1' }, { seq: '2' }, { seq: '7' }, { seq: '6' }, { seq: '5' }]));
// false
console.log(hasDupes([{ seq: '' }, { seq: '1' }, { seq: '' }, { seq: '7' }, { seq: '6' }, { seq: '5' }]));
// true
console.log(hasDupes([{ seq: '4' }, { seq: '1' }, { seq: '2' }, { seq: '4' }, { seq: '3' }, { seq: '4' }]));

答案 3 :(得分:0)
我的猜测是你以某种方式混合了字符串和整数,这就是为什么你的排序出错了。我建议你稍微修改你的映射函数。
$scope.myDataset.map(v => parseInt(v.seq + '') ).sort().sort((a, b) => {
if (a !== '' && b !== '' && a === b) {
$scope.duplicateFound = true
}
})
答案 4 :(得分:0)
我将数据对象移到了迭代之上。不确定你为什么要排序,目标是什么。我在对象中添加了一个额外的键值对,如果它已被访问,则必须跟踪它。
在循环中,我们添加另一个迭代来将下一个元素与索引的当前元素进行比较。为了确保它不超出数组的范围,我们从长度中减去一个,并且在开始循环时我们做'小于'(<),而不是'小于或等于'(< =)因为这也会导致它超出数组的索引范围。
如果将访问密钥与自身之后的另一个迭代进行比较,则访问密钥将为真。
$scope.duplicateFound = false;
$scope.myDataset = [
{
seq: '1',
visited: false
},
{
seq: '2',
visited: false
},
{
seq: '3',
visited: false
},
{
seq: '4',
visited: false
},
{
seq: '4',
visited: false,
}
];
for (var index = 0; index < $scope.myDataset.length - 1; index++){
var index2 = index + 1;
if ($scope.myDataset[index]['visited'] === false && $scope.myDataset[index2]['visited'] === false) {
if ($scope.myDataset[index]['seq'] == $scope.myDataset[index2]['seq']) {
$scope.duplicateFound = true;
}
}
$scope.myDataset[index]['visited'] = true;
}
console.log($scope)
答案 5 :(得分:0)
如果您想使用Lodash(https://lodash.com/docs/4.17.4)JavaScript库,那么这里是一个很好的解决方案。
var app = angular.module(&#39; test&#39;,[]);
app.controller(&#39; testctrl&#39;,function($ scope){
$scope.myDataset = [
{ seq: '1', },
{ seq: '2', },
{ seq: '3', },
{ seq: '4', },
{ seq: '2', },
{ seq: '', },
];
console.log($scope.myDataset);
console.log(_.unionBy(_.filter($scope.myDataset, function(o) {
return !_.isEmpty(o.seq);
}), 'seq'));
});