下划线/洛达什号中的快捷方式,用于(递归)设置对象的所有属性

Shortcut in Underscore/Lodash to (recursively) set all properties of an object

本文关键字:递归 设置 对象 属性 用于 快捷方式 下划线      更新时间:2023-09-26

我正在尝试一种更实用的风格,并希望将对象(如果可能的话,子对象)的所有属性设置为特定值,例如 false到位。是否有快捷方式,或者我必须迭代属性?

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

转换为:

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

您可以将下划线用于更实用的样式。

您可以迭代您的对象,如果缺少,

您可以更改,或者如果它子对象重申并更改每个缺少的子对象属性。

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

我已经编写了类似的东西,用于对嵌套在我的对象中与给定模式匹配的字段执行正则表达式替换。然后,我将它混合到下划线/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);
}

要将其添加为混合:

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