使用下划线在对象中递归地将“”转换为false

时间:2013-04-03 18:18:55

标签: javascript underscore.js

我正在尝试使用下划线将所有""值转换为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;
}

2 个答案:

答案 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可能会更容易。

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) { ... }之类的代码,那么根本不需要这样做。