【问题标题】:Nested properties as function argument嵌套属性作为函数参数
【发布时间】:2015-01-22 00:23:36
【问题描述】:

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

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

【问题讨论】:

标签: javascript


【解决方案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;
});

希望对您有所帮助。

【讨论】:

  • 创意!但是我在函数中隐藏了更多代码......这样我可以在一行中调用它:reminders = unique(reminders, 'customer.email');。变得更具可读性。
【解决方案2】:

其他版本

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

【讨论】:

    猜你喜欢
    • 2015-09-08
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多