嵌套属性作为函数参数

Nested properties as function argument

本文关键字:函数 参数 属性 嵌套      更新时间:2023-09-26

我正在尝试做一个简洁的小函数来过滤对象数组,以便仅返回具有某个属性唯一值的对象。当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');

是否有一种优雅的方法可以将嵌套属性作为参数,还是应该避免这种情况?

我将传入一个属性函数,而不是传递属性名称:

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

希望有帮助。

其他版本

   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);