下划线/洛达什号中的快捷方式,用于(递归)设置对象的所有属性
Shortcut in Underscore/Lodash to (recursively) set all properties of an object
我正在尝试一种更实用的风格,并希望将对象(如果可能的话,子对象)的所有属性设置为特定值,例如 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
}
});
相关文章:
- 数组在递归方法中设置为null
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- 递归使用 eval() 是检查程序执行的好方法吗?
- 使用递归、Ramda.js和无点样式重构字符串的getPermutations()
- 递归深度比较
- Eloquent JavaScript递归示例如何终止为返回1,但仍然输出指数值
- 递归函数中断
- 如何递归地获取嵌套对象中所有子对象的列表
- JavaScript 素数搜索无限递归
- 在递归生成器函数中,yield后面的*(星号/星号)语法意味着什么
- 下划线/洛达什号中的快捷方式,用于(递归)设置对象的所有属性
- 将 PHP preg_replace 转换为 javascript 并将其设置为递归
- 如何从方法中使用递归设置超时
- 以递归方式设置“显示:无”,但在特定元素内除外
- 递归,而不显式设置变量javascript
- Javascript在递归函数上设置超时
- 将Javascript局部变量设置为全局变量以实现递归循环
- 在递归JQuery/Javascript自执行函数(轮询)中设置变量
- 递归地循环遍历树,并在迭代之间设置超时
- 使用递归函数动态设置一个嵌套值