【问题标题】:Whitelist nested properties using this particular object format使用此特定对象格式将嵌套属性列入白名单
【发布时间】:2015-05-14 03:00:58
【问题描述】:

需要“白名单”对象如下所示:

{
    a: {
        b: {
            c: ''
        }
    }
}

适用于:

{
    a: {
        b: {
            c: 1
        }
        d: 2
        e: 3
    }
}

结果:

{
    a: {
        b: {
            c: 1
        }
    }
}

有什么建议吗?不知道如何使用下划线来实现这一点。正在查看 _.pick,但遇到了嵌套问题。

【问题讨论】:

  • SO 的全部意义在于发布您遇到问题的代码,而不是让我们为您完成工作。如果您需要帮助,请分享您的代码

标签: javascript json underscore.js lodash


【解决方案1】:

使用Array.prototype.reduce()进行递归:

function getPaths(obj, whiteList) {  
  return Object.keys(whiteList)
    .reduce(function(whiteObj, key) {
      if (!obj.hasOwnProperty(key)) {
      } else if(typeof obj[key] === 'object') {
        whiteObj[key] = getPaths(obj[key], whiteList[key]);
      } else {
        whiteObj[key] = obj[key];
      }
    
      return whiteObj;
    }, {})
}

var whiteList = {
  a: {
    b: {
      c: ''
    }
  },
  g: ''
};

var obj = {
  a: {
    b: {
      c: 1
    },
    d: 2,
    e: 3
  }
};

var result = getPaths(obj, whiteList);

console.log(result);

【讨论】:

    【解决方案2】:

    我会写一个这样的函数:

    function filter_nested_properties_in_object(allowed_properties, original_object) {
        if (_.contains(['boolean', 'number', 'string'], typeof original_object))
            return original_object;
        var filtered_object = {};
        _.each(allowed_properties, function(allowed_value, property_name) {
            var original_value = original_object[property_name];
            if (original_value !== undefined)
                filtered_object[property_name] = filter_nested_properties_in_object(
                    allowed_value, original_value);
        });
        return filtered_object;
    }
    

    将您的“白名单对象”作为allowed_properties 传递,将要应用它的对象作为original_object 传递。

    【讨论】:

      【解决方案3】:

      不创建自定义函数,一种方法是使用标准的内置对象方法,例如 JSON.stringify 和 JSON.parse。 JSON.stringify 接受三个参数(值、替换?、空格?)。 Replacer 可以是自定义节点访问者函数或将属性键列入白名单的数组。根据以上信息,下面的代码将实现你想要完成的:

      var obj= {
          a: {
              b: {
                  c: 1
              },
              d: 2,
              e: 3
          }
      };
      var tempstr=JSON.stringify(obj.a,['b']);
      var newobj=JSON.parse(tempstr);
      obj.a=newobj;
      

      obj // 现在应该为您提供列入白名单的对象

      【讨论】:

        猜你喜欢
        • 2016-09-17
        • 1970-01-01
        • 1970-01-01
        • 2017-10-05
        • 2013-07-04
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多