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

如何使用ES6 HOF Javascript在数组中查找重复对象(所有键值对应相同),javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,上面是我使用两个for循环完成的一个对象数组,但这看起来不太好,有人能建议如何使用ES6高阶函数完成吗 这里的重复表示每个属性完全匹配 以下是我是如何做到这一点的: var records = [ { "defaultContact":true, "contactName":"testContactName", "mobileNumber":"900000000000", "mobileDialCode":"+91 IN",

上面是我使用两个for循环完成的一个对象数组,但这看起来不太好,有人能建议如何使用ES6高阶函数完成吗

这里的重复表示每个属性完全匹配

以下是我是如何做到这一点的:

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比使用高阶函数更合适。但您可以使用Object.keys和Array.filter使代码更加通用和简短

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]];
        }
      }
    }

谢谢@Prabhjot Singh Kainth不,如果有重复的对象,我想要它。Change duplicateRecords=[records[j]];复制记录。pushrecords[j];。感谢@FelixKling的建议,但我希望通过使用ES6函数来转换和完成此操作,无论如何,上面的操作都是有效的,但是如果您可以建议使用Array.every或类似的东西可以实现。FWIW,Array.every已经是ES5的一部分。在你的情况下,每一条都没有意义,因为你想找回重复的记录。每个返回一个布尔值。基本相同,但感谢您为它添加了一些ES6风格,这就是我想要的。你知道我们可以在lodash中做什么吗,只是这个循环看起来不太好。更新答案,带解决方案,不带for
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;
}, []);