javascript - 在对象数组中查找重复的设置值

标签 javascript arrays angularjs

我有一个 UI,其中有一个 HTML 表格,我们可以在其中添加动态行和列(angularjs)

该表有 2 个静态列 ID 和说明,其余列是动态列,用户必须在其中添加一列或多列。(单击按钮) 单击“保存”按钮后,我想验证用户是否添加了唯一的动态列。

下面的变量保存行数组,如下所示:

 $scope.myTable.Rows 

下面是用户仅添加一列和两行时生成的数组。这里 id 和 description 是静态列,而“0”是添加的动态列。

{0: "1111", description: "desc1", id: "1111"}
{0: "2222", description: "desc2", id: "2222"}

添加 3 个动态列、3 行时的另一个示例:

{0: "a1", 1: "a2", 2: "a3", description: "desc1", id: "1111"}
{0: "a5", 1: "a6", 2: "a7", description: "desc2", id: "2222"}
{0: "a9", 1: "a10", 2: "a11", description: "desc3", id: "3333"}

我想检查上面的数组仅在动态列的组合中是否唯一。即根据上面的数组,动态列 0、1、2 的设置值不应在数组中的任何其他行中重复。

因此下面的数组集不应通过验证:

{0: "a1", 1: "a2", 2: "a3", description: "desc1", id: "1111"}
{0: "a5", 1: "a6", 2: "a7", description: "desc2", id: "2222"}
{0: "a1", 1: "a2", 2: "a3", description: "desc3", id: "3333"}

如您所见,上面的第三行与第一行类似。我不想考虑列“id”和“description”

虽然下面仍然是独特的:

{0: "a1", 1: "a2", 2: "a3", description: "desc1", id: "1111"}
{0: "a5", 1: "a6", 2: "a7", description: "desc2", id: "2222"}
{0: "a1", 1: "a2", 2: "a9", description: "desc3", id: "3333"}

我尝试在以下位置查看几篇文章: How can I check if the array of objects have duplicate property values?

但大多数情况下都是查看单个属性并查看是否有重复但不是组合集合。

我希望我已经清楚地解释了我的要求。如果您需要更多信息,请告诉我。

--更新--

我尝试过:

 let array = [
  {0: "a1", 1: "a2", 2: "a3", description: "desc1", id: "1111"},
 {0: "a5", 1: "a6", 2: "a7", description: "desc2", id: "2222"},
 {0: "a1", 1: "a2", 2: "a3", description: "desc3", id: "3333"}];

 let jsonRows = JSON.parse(JSON.stringify(array));
 var valueArr = jsonRows.map(function(item){ return item."0" });
   //above gives error: Uncaught SyntaxError: Unexpected string
 var isDuplicate = valueArr.some(function(item, idx){ 
return valueArr.indexOf(item) != idx 
 });

console.log(jsonRows);

最佳答案

这就是我认为我们可以在这里做的非常简单的事情,创建一个映射,其中键作为每行每个动态属性的值。如果已经存在找到重复项的属性,则获取每一行并添加到 map 。

我使用 || 作为分隔符组合每个值以创建唯一键,使用不会成为动态属性值的唯一键。

 function isUniqueData(data) {
    let map = {}, isUnique = true;
    data.filter(function(item, index) {
      let prop = "";
      for(var key in item) {
        if(key != "description" && key != "id") {
          prop += item[key] + "||";
        }  
      }
      if(map[prop]) {
        isUnique = false;
      } else {
        map[prop] = item;
      }
    }); 
    return isUnique;
 }

var data1 = [
  {0: "a1", 1: "a2", 2: "a3", description: "desc1", id: "1111"},
  {0: "a5", 1: "a6", 2: "a7", description: "desc2", id: "2222"},
  {0: "a5", 1: "a6", 2: "a7", description: "desc2", id: "2222"},
  {0: "a1", 1: "a2", 2: "a9", description: "desc3", id: "3333"}
];
console.log(isUniqueData(data1))

var data2 = [
  {0: "a1", 1: "a2", description: "desc1", id: "1111"},
  {0: "a5", 1: "a6", description: "desc2", id: "2222"},
  {0: "a1", 1: "a4", description: "desc3", id: "3333"}
];
console.log(isUniqueData(data2))

关于javascript - 在对象数组中查找重复的设置值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52277065/

相关文章:

javascript - Windows Safari VLC Web 插件中的流媒体停止

javascript - 下划线模板在调试器中不起作用

javascript - Dojo 单选按钮 - 以编程方式检查其中之一

javascript - 来自本地计算机的数据

c# - 如何从数组中随机选择一行?

c# - C# 新手,无法创建多维数组

c - 删除C中重复的数组元素

twitter-bootstrap - 将 datetimepicker 连接到 angularjs

c# - 如何使用 Selenium Webdriver 自动测试 Angular JS

css - AngularJS 图形和图表 - 实线和点线的混合