使用此特定对象格式的白名单嵌套属性

时间:2015-05-14 03:00:58

标签: javascript json underscore.js lodash

需要“白名单”对象看起来像这样:

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

申请:

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

结果:

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

有什么建议吗?不确定如何使用下划线实现此功能。看着_.pick但是遇到了麻烦。

3 个答案:

答案 0 :(得分:0)

我会写一个这样的函数:

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

答案 1 :(得分:0)

使用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 :(得分:0)

不是创建自定义函数,一种方法是使用标准的内置对象方法,如JSON.stringify和JSON.parse。 JSON.stringify接受三个参数(value,replacer?,space?)。 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 //现在应该为您提供白名单对象