Underscore / Lodash中的快捷方式(递归地)设置对象的所有属性

时间:2015-02-01 20:30:08

标签: javascript underscore.js lodash

我正在尝试使用更具功能性的样式,并希望将对象的所有属性(以及可能的子对象)设置为特定值,例如false就位。有快捷方式还是我必须迭代属性?

var obj = {
  a: true,
  b: true,
  c: true,
  ...
  z: true
}

转变为:

var obj = {
  a: false,
  b: false,
  c: false,
  ...
  z: false
}

2 个答案:

答案 0 :(得分:1)

您可以使用下划线来实现更实用的风格。

如果缺少可以更改的对象,或者子对象重复并更改每个缺少的子对象属性,则可以迭代对象。

function remap(object, missingValue, suppliedValue){
  var keys= _.keys(object);
  return _.reduce(keys, function(memo, key){
      memo[key] = object[key];
      if(memo[key] === missingValue){
         memo[key] = suppliedValue;

      }
      if(_.isObject(memo[key])){
        memo[key] = remap(memo[key],missingValue,suppliedValue);
      }
      return memo;
  }, {});
}

var h = {val : 3, b : undefined, d : undefined , k : {
  a: false, b: undefined
}, c: function(){ console.log(a);}};

console.log(remap(h,undefined,false));

如果您需要更复杂的检查来比较值,请使用以下函数。

function remap(object, complexCheck){
  var keys= _.keys(object);
  return _.reduce(keys, function(memo, key){
      memo[key] = object[key];
      memo[key] = complexCheck(memo[key]);
    if(_.isObject(memo[key])){
      memo[key] = remap(memo[key],complexCheck);
    }
    return memo;
  }, {});
}

答案 1 :(得分:0)

我已经编写了类似的内容,用于对嵌套在我的对象中的字段执行正则表达式替换,该字段匹配给定的模式。然后我将它混合到下划线/ lodash对象中,这样我就可以像你想要的那样使用它。

根据您的目的修改它可能看起来像这样:

function(obj) {
    var $this = this,
        checkField = function(field) {
            if (typeof field === "undefined" || field === null || typeof field === "boolean") {
                return false;
            } else {
                return field;
            }
        },
        checkObject = function(obj) {
            if (obj instanceof Object) {
                Object.getOwnPropertyNames(obj).forEach(function (val) {
                    if (obj[val] instanceof Array) {
                        obj[val] = checkArray(obj[val]);
                    } else if (obj[val] instanceof Object) {
                        obj[val] = checkObject(obj[val]);
                    } else {
                        obj[val] = checkField(obj[val]);
                    }
                });
                return obj;
            } else if (obj instanceof  Array) {
                return checkArray(obj);
            } else {
                return checkField(obj);
            }
        },
        checkArray = function(arr) {
            if (arr instanceof Array) {
                arr.forEach(function(val) {
                    if (val instanceof Object) {
                        obj[val] = checkObject(val);
                    } else {
                        obj[val] = checkField(val);
                    }
                });
                return arr;
            } else {
                return arr;
            }
        };
    obj = checkObject(obj);
}

将其添加为mixin:

window._.mixin({
   setBoolsAndSuchToFalse: function(obj) {
      . . . . // The contents of the function from above
   }
});