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