javascript - 如何使用 ES6 HOF Javascript 在数组中查找重复对象(所有键值对应该相同)

标签 javascript arrays ecmascript-6

var records = [ 
   { 
      "defaultContact":true,
      "contactName":"testContactName",
      "mobileNumber":"900000000000",
      "mobileDialCode":"+91 IN",
      "faxNumber":"123",
      "faxDialCode":"+91 IN",
      "emailId":"test@gmail.com"
   },
   { 
      "defaultContact":false,
      "contactName":"xyz",
      "mobileNumber":"900000001000",
      "mobileDialCode":"+91 IN",
      "faxNumber":"123",
      "faxDialCode":"+91 IN",
      "emailId":"xyz@gmail.coma"
   },
   { 
      "defaultContact":false,
      "contactName":"asdasd",
      "mobileNumber":"123",
      "mobileDialCode":"+91 IN",
      "faxNumber":"",
      "faxDialCode":"",
      "emailId":""
   },
   { 
      "contactName":"asdasd",
      "defaultContact":false,
      "emailId":"",
      "faxDialCode":"",
      "faxNumber":"",
      "mobileDialCode":"+91 IN",
      "mobileNumber":"123"
   }
];

上面是一个对象数组,我使用两个 for 循环完成了此操作,但这看起来不太好,任何人都可以建议如何使用 ES6 高阶函数来完成此操作。

这里的重复意味着每个属性都完全匹配。

下面是我的做法:

let duplicateRecords = [];
    for (let i = 0; i < records.length; i++) {
      for (let j = i + 1; j < records.length; j++) {
        if (
          records[i].contactName === records[j].contactName &&
          records[i].emailId === records[j].emailId &&
          records[i].faxDialCode === records[j].faxDialCode &&
          records[i].faxNumber === records[j].faxNumber &&
          records[i].mobileDialCode === records[j].mobileDialCode &&
          records[i].mobileNumber === records[j].mobileNumber
        ) {
          duplicateRecords = [records[j]];
        }
      }
    }

如有任何帮助,我们将不胜感激。

最佳答案

在您的情况下,使用循环for比高阶函数更合适。但是您可以使用 Object.keysArray.filter 使您的代码更加通用和简短。

for (let i = 0; i < records.length; i++) {
   const keys = Object.keys(records[i]);
     for (let j = i + 1; j < records.length; j++) {
         const isDublicated = !Boolean(keys.filter(key => records[i][key] !== records[j][key]).length);
         isDublicated ? dublicatedRecords.push(records[j]) : null;
     }
}

或者使用高阶函数:

const dublicatedRecords = records.reduce((acc, record, index) => {
  const keys = Object.keys(record);
  records.forEach((otherRecord, otherIndex) => {
      const isDublicated = !Boolean(keys.filter(key => record[key] !== otherRecord[key]).length);
      isDublicated && index !== otherIndex ? acc.push(otherRecord) : null;
  })
  return acc;
}, []);

关于javascript - 如何使用 ES6 HOF Javascript 在数组中查找重复对象(所有键值对应该相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59561224/

相关文章:

Javascript,创建和监听自定义事件

javascript - 如何删除 bootstrap 4 列之间的空间

javascript - 将字符串树转换为数组

javascript - 从对象 ES6 创建键值数组

java - 如何在java中实现具有可编程维数的快速多维数组?

angular - ng serve --prod for ng-cli 结果在 UglifyJs SyntaxError : Unexpected token: name

javascript - 如何在数据添加到数据库后立即将数据发送到网页

javascript - 索环:顶部和底部选项卡激活相同的内容

javascript - 将 HTML 中的表单文本转换为 JS 中的数组

javascript - JSON 数组长度为零,即使有元素?