[英]How to get the Uniq objects Using javascript or lodash
i am having the Array of objects like this我有这样的对象数组
var result={
"employees": [
{
"_id": "5796e7a27d075bd0453b7751",
"firstName": "Test4",
"schemaName": "Employee"
},
{
"_id": "5796e78e7d075bd0453b774f",
"firstName": "Test 3",
"schemaName": "Employee"
},
{
"_id": "5790b203df5ad69025e8a20b",
"email": "df@gmail.com",
"schemaName": "Employee"
},
{
"_id": "577f69cc789df5ec1e995513",
"firstName": "Jeevan",
"email": "ddd@asd.com",
"schemaName": "Employee"
},
{
"_id": "577f69cc789df5ec1e995513",
"firstName": "Chethan",
"email": "ddd@asd.com",
"schemaName": "Employee"
}
]
};
};
but i want uniq objects by email.但我想通过电子邮件获得 uniq 对象。 i am using lodash uniq but its Not giving proper Result.
我正在使用 lodash uniq 但它没有给出正确的结果。 here i tried this code.
在这里,我尝试了此代码。
var combined=result.employees.map(function(employee){
employee.schemaName='Employee';
return employee;
});
combined = _.uniq(combined, 'email');
console.log(combined);
The Result is coming like this.结果是这样来的。
[ { _id: '5796e7a27d075bd0453b7751',
firstName: 'Test4',
schemaName: 'Employee' },
{ _id: '5790b203df5ad69025e8a20b',
email: 'df@gmail.com',
schemaName: 'Employee' },
{ _id: '577f69cc789df5ec1e995513',
firstName: 'Jeevan',
email: 'ddd@asd.com',
schemaName: 'Employee' } ]
i want the objects which are not having email ids and i want only objects which are unique emailid's can anybody help me on this.我想要没有电子邮件 ID 的对象,我只想要唯一电子邮件 ID 的对象,任何人都可以帮助我。 I want the Result contain the objects Which are not having email id also.
我希望结果包含也没有电子邮件 ID 的对象。 The Result should be like this.
结果应该是这样的。
[ { _id: '5796e7a27d075bd0453b7751',
firstName: 'Test4',
schemaName: 'Employee' },
{ _id: '5796e78e7d075bd0453b774f',
firstName: 'Test3',
schemaName: 'Employee' },
{ _id: '5790b203df5ad69025e8a20b',
email: 'df@gmail.com',
schemaName: 'Employee' },
{ _id: '577f69cc789df5ec1e995513',
firstName: 'Jeevan',
email: 'ddd@asd.com',
schemaName: 'Employee' } ]
这也可以做到。
_.uniqBy(result.employees, function(employee){return employee.email || employee._id;});
I would recommend the use of _.uniqWith for this with your own comparator.我会建议使用_.uniqWith与您自己的比较器。
var result = { "employees": [ { "_id": "5796e7a27d075bd0453b7751", "firstName": "Test4", "lastName": "T", "__v": 0, "schemaName": "Employee" }, { "_id": "5796e78e7d075bd0453b774f", "firstName": "Test 3", "lastName": "T", "__v": 0, "schemaName": "Employee" }, { "_id": "5796e77e7d075bd0453b774d", "firstName": "Test 2", "lastName": "T", "__v": 0, "documents": [], "schemaName": "Employee" }, { "_id": "5796e7707d075bd0453b774b", "firstName": "Test1", "lastName": "T", "__v": 0, "schemaName": "Employee" }, { "_id": "5790b203df5ad69025e8a20b", "firstName": "Ganesh", "lastName": "dsf", "__v": 0, "email": "df@gmail.com", "schemaName": "Employee" }, { "_id": "577f69cc789df5ec1e995513", "firstName": "Jeevan", "__v": 0, "email": "fs@asf.com", "schemaName": "Employee" }, { "_id": "577f69cc789df5ec1e995513", "firstName": "Chethan", "__v": 0, "email": "fs@asf.com", "schemaName": "Employee" } ] }; // Create a lodash chain from the employees. combined = _.uniqWith(result.employees, function(e1, e2){ return e1.email && e1.email === e2.email; }); console.log(combined);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.14.0/lodash.min.js"></script>
I'm using a deepEquals
algorithm so this code becomes more general.我正在使用
deepEquals
算法,因此此代码变得更通用。 If you want to check only by email, just change the equals
function below.如果您只想通过电子邮件查看,只需更改下面的
equals
函数即可。
const equals =
// Naïve deepEquals, only for demo. Doesn't work if keys orders vary.
(obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2);
// A real deepEquals:
// https://www.npmjs.com/package/fast-deep-equal
const uniq = (el1, index1, array) =>
array.every((el2, index2) => index1 <= index2 || !equals(el1, el2));
[{ a: 1, b: 2 }, { c: 3 }, { a: 1, b: 2 }, { d: 4 }, { a: 1, b: 2 }].filter(uniq);
// Result: [ { a: 1, b: 2 }, { c: 3 }, { d: 4 } ]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.