【问题标题】:Get unique and duplicate values获取唯一值和重复值
【发布时间】:2018-03-03 20:03:35
【问题描述】:

我有这个 JSON 数据:

vm.userListData = [{
        "listId": 1,
        "permission": "READ"
    }, {
        "listId": 2,
        "permission": "WRITE"
    }, {
        "listId": 2,
        "permission": "READ"
    }, {
        "listId": 3,
        "permission": "READ"
    }, {
        "listId": 3,
        "permission": "WRITE"
    }, {
        "listId": 4,
        "permission": "WRITE"
    }, {
        "listId": 5,
        "permission": "WRITE"
    }]

还有这个:

vm.userComplementaryList = [{
    "listId": 1,
    "confidentiality": "PUBLIC",
    "listName": "List name here..1",
    "permission": "WRITE"
}, {
    "listId": 2,
    "confidentiality": "PUBLIC",
    "listName": "List name here..2",
    "permission": "READ"
}, {
    "listId": 3,
    "confidentiality": "CONFIDENTIAL",
    "listName": "List name here..3",
    "permission": "WRITE"
}, {
    "listId": 4,
    "confidentiality": "CONFIDENTIAL",
    "listName": "List name here..4",
    "permission": "WRITE"
}, {
    "listId": 5,
    "confidentiality": "CONFIDENTIAL",
    "listName": "List name here..5",
    "permission": "READ"
}]

使用这两个 JSON 数据,我必须过滤并获取唯一值并将它们推送到数组和重复的值(listId 和权限)中,将它们推送到其他数组中。 我这样做了:

vm.listForGrid = [];
vm.listForDropDown = [];

(function(){
    for(var i = 0; i < vm.userComplementaryList.length; i++) { 
        for(var j = 0; j < vm.userListData.length; j++) {   
            if( (vm.userComplementaryList[i].listId == vm.userListData[j].listId) && (vm.userComplementaryList[i].permission == vm.userListData[j].permission) ) {
                vm.listForGrid.push(vm.userComplementaryList[i]);
            }
            else {
                vm.listForDropDown.push(vm.userComplementaryList[i]);
            }
        }
    }
})();

vm.listForGrid 没问题,但 vm.listForDropDown 的值不止一次,我必须 break 循环。

重复的值与两个数组中的 listId 和权限相同

谢谢!

【问题讨论】:

  • break 当你发现 listid 相同时。
  • 把你的代码放到 plunkr

标签: javascript angularjs json for-loop filter


【解决方案1】:

这是一个使用 array.some 的排序器版本

vm.userComplementaryList.forEach(function(vCom) {
    vm.userListData.some(function(vUser) {
        return (vCom.listId == vUser.listId && vCom.permission == vUser.permission);
    }) ? vm.listForGrid.push(vCom) : vm.listForDropDown.push(vCom);
})

【讨论】:

    【解决方案2】:

    我解决了这个问题:

    (function(){
        for(var i = 0; i < vm.userComplementaryList.length; i++) { 
            var found = false;
            for(var j = 0; j < vm.userListData.length; j++) {   
                if( (vm.userComplementaryList[i].listId == vm.userListData[j].listId) && (vm.userComplementaryList[i].permission == vm.userListData[j].permission) ) {
                    found = true;
                    break;
                }
            }
            if(found) {
                vm.listForGrid.push(vm.userComplementaryList[i]);
            }
            else {
                vm.listForDropDown.push(vm.userComplementaryList[i]);
            }
        }
    })();
    

    【讨论】:

    • 你仍然需要一个嵌套循环来查找相同的元素。
    【解决方案3】:

    如果获得许可,您仍然可以使用哈希表作为参考。然后你只需要一个没有嵌套循环的循环来对项目进行排序。

    var vm = {},
        permissions = {};
    
    vm.userListData = [{ "listId": 1, "permission": "READ" }, { "listId": 2, "permission": "WRITE" }, { "listId": 2, "permission": "READ" }, { "listId": 3, "permission": "READ" }, { "listId": 3, "permission": "WRITE" }, { "listId": 4, "permission": "WRITE" }, { "listId": 5, "permission": "WRITE" }];
    vm.userComplementaryList = [{ "listId": 1, "confidentiality": "PUBLIC", "listName": "List name here..1", "permission": "WRITE" }, { "listId": 2, "confidentiality": "PUBLIC", "listName": "List name here..2", "permission": "READ" }, { "listId": 3, "confidentiality": "CONFIDENTIAL", "listName": "List name here..3", "permission": "WRITE" }, { "listId": 4, "confidentiality": "CONFIDENTIAL", "listName": "List name here..4", "permission": "WRITE" }, { "listId": 5, "confidentiality": "CONFIDENTIAL", "listName": "List name here..5", "permission": "READ" }];
    
    vm.listForDropDown = [];
    
    vm.userListData.forEach(function (p) {
        permissions[p.listId] = permissions[p.listId] || {};
        permissions[p.listId][p.permission] = true;
    });
    
    vm.listForGrid = vm.userComplementaryList.filter(function (a) {
        if (permissions[a.listId] && permissions[a.listId][a.permission]) {
            return true;
        }
        vm.listForDropDown.push(a);
    });
    
    console.log(vm.listForGrid);
    console.log(vm.listForDropDown);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 2012-10-19
      • 2012-06-30
      • 2023-03-21
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多