我正在尝试使用一个简洁的小函数来过滤对象数组,以便只返回具有特定属性的唯一值的对象。当prop
只是"email"
这样的普通属性时,此函数可以正常工作。但是当将嵌套属性作为参数提供时,该函数不起作用,如"customer.email"
var unique = function (arr, prop) {
var found = [];
return arr.filter(function (obj) {
if (found.indexOf(obj[prop]) < 0) return found.push(obj[prop]);
});
};
reminders = unique(reminders, 'customer.email');
是否有一种优雅的方式可以将嵌套属性作为参数提供,还是应该避免这种情况?
答案 0 :(得分:1)
我将传入属性函数,而不是传递属性名称:
var unique = function (arr, prop) {
var found = [];
return arr.filter(function (obj) {
var value = prop(obj);
var result = found.indexOf(value) < 0;
if (result) found.push(value);
return result;
});
};
var reminders = unique(reminders, function (obj) {
return obj.customer.email;
});
希望有所帮助。
答案 1 :(得分:0)
其他版本
var unique = function (arr, prop) {
var found = [];
return arr.filter(function (obj) {
var i=0, currentProp;
while (obj && (currentProp=(prop.split("."))[i++]) ) {
obj=obj[currentProp];
}
if (found.indexOf(obj) < 0) return found.push(obj);
});
};
var reminders=[{customer : {email:'test'}},{customer : {email:'vlad'}},{customer : {email:'vlad'}}];
reminders= unique(reminders, 'customer.email');
console.log(reminders);
var reminders=[ {email:'test'}, {email:'vlad'}, {email:'vlad'}];
reminders= unique(reminders, 'email');
console.log(reminders);