我正在尝试使用更具功能性的样式,并希望将对象的所有属性(以及可能的子对象)设置为特定值,例如false
就位。有快捷方式还是我必须迭代属性?
var obj = {
a: true,
b: true,
c: true,
...
z: true
}
转变为:
var obj = {
a: false,
b: false,
c: false,
...
z: false
}
答案 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
}
});