我正在尝试使用下划线将所有""
值转换为false
,但它无效。有更简单的方法吗?
var _ = require("underscore");
var test = {
"one": "",
"two": "",
"three": {
"four": ""
},
"five": "this string is intact"
};
第一次尝试,弄乱对象
function z(object){
return _.map(object, function(value, key, list){
if(_.isObject(value)){
return z(value);
}else{
var ret = {};
ret[key] = (value == "") ? false : value;
return ret;
}
});
}
第二次尝试失败
var _false = function(object){
var nb = {};
var _false = function _false(object, parent){
_.each(object, function(value, key, list){
if(_.isObject(value)){
nb[key] = {};
return _false(value, key);
}else{
nb[parent] = (value == "") ? false : value;
}
});
}(object);
return nb;
}
答案 0 :(得分:3)
如果你想修改你的对象,你必须继续这样做!
function z(object){
_.each(object, function(value, key){
if(_.isObject(value)){
z(value);
}else{
object[key] = (value === "") ? false : value;
}
});
}
直接修改对象,而不是创建新对象。
_.map()
的问题在于它始终返回数组。如果你想最终得到一个对象,就像原版一样,你就无法使用它。
答案 1 :(得分:1)
为什么需要使用下划线?使用普通的JS for / in可能会更容易。
// Accepts an object to convert '' -> false
var falsify = function(obj) {
// for each key in the object
for (var key in obj) {
// store the value for this key in a local variable
var value = obj[key];
// if the value is an empty string
if (value === '') {
// update the object, change the value of this key to false
obj[key] = false;
// Value is not empty string.
// So is it an object?
} else if (typeof value === 'object') {
// It IS an object! that means we need to do all this again!
// This is what makes this recursive
falsify(value);
}
}
// return the modified object, though the object passed
return obj;
};
// test data
var test = {
"one": "",
"two": "",
"three": {
"four": ""
},
"five": "this string is intact"
};
// proof it works, all empty strings are now `false`.
alert(JSON.stringify(falsify(test)));
但最后,请确保您需要这样做... ""
是JavaScript中的虚假价值。这意味着:
var emptyString = "";
if (emptyString) {
// never gonna happen
} else {
// always gonna happen
}
因此,如果您只想编写if (test.one) { ... }
之类的代码,那么根本不需要这样做。