检查JSON对象数组

时间:2017-07-23 15:01:32

标签: javascript angularjs

我有这个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: '', },

];

6 个答案:

答案 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)

以下是使用Setarray#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'));

});