2

我正在尝试将所有""值转换为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;
}
4

2 回答 2

3

如果你想修改你的对象,你必须继续去做!

function z(object){ 
    _.each(object, function(value, key){
        if(_.isObject(value)){
            z(value);
        }else{
            object[key] = (value === "") ? false : value;
        }
    });
}

这会直接修改您的对象,而不是创建新对象。

问题_.map()在于它总是返回一个数组。如果你想最终得到一个对象,就像原来的一样,你不能使用它。

于 2013-04-03T18:25:17.437 回答
1

为什么需要使用下划线?使用普通的 JS for/in 可能更容易。

http://jsfiddle.net/dSZbe/

// 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) { ... }那么您根本不需要这样做。

于 2013-04-03T18:26:09.297 回答