递归探索带下划线的对象并转换字段类型

Explore recursively an Object with Underscore and convert field type

我正在使用一些自定义 jSON 对象。

我正在尝试探索整个对象,并更改字段类型。

例如real_id或clean_id甚至温度需要转换为整数。

为了解决这个问题,我开始制作一个非常简单的函数:

var reg = /^\d+$/;
_.each(myObject, function(val, key) {
    myObject[key] = reg.test(val) ? parseInt(val) :val;
});

我有几个需求:

  1. 它将在第一级逐一检查每个字段,但是如果 myObject 具有本身包含对象或对象数组的元素,我的 _.each 将不会探索它们。
  2. 由于正则表达式,现在它可以检测整数,并将它们转换为整数,但如果我需要转换浮点数怎么办?
  3. 如果我发现 null,我需要将其设置为 0

以我下面的例子为例,

jSON 对象的样本示例:

myObject = {
    "real_name": "Test",
    "maker": "Jean-Paul",
    "company": "",
    "real_id": "646402",
    "clean_id": "152691",
    "year": 2013,
    "type": "Red real",
    "available_for_order": 0,
    "level": null,
    "bio": null,
    "temperature": "15",
    "potential": "3",
    "country_code": "USA",
    "coord_lng": "2.7014349999999",
    "coord_lat": "42.717317",
    "real_description": [
        {
            "comment": "Real good stuff",
            "lang": "it",
            "video_end": null,
            "video_id": null,
            "video_start": null,
            "video_url": null
        },
        {
            "comment": "Awesome and cheap stuff",
            "lang": "en",
            "video_end": null,
            "video_id": null,
            "video_start": null,
            "video_url": null
        }
    ],
    "full_description": [
        {
            "description": "Long description",
            "lang": "fr"
        },
        {
            "description": "",
            "lang": "en"
        }
    ],
    "list": [
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 0,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "656732",
            "year": "1"
        },
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 0,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "330381",
            "year": "2008"
        },
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 20,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "11453216",
            "year": "2010"
        },
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 0,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "11497420",
            "year": "2011"
        },
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "1",
            "currency_code": "EUR",
            "price": 10,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "11506715",
            "year": "2012"
        },
        {
            "available_for_order": "1",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 10,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "11458207",
            "year": "2013"
        }
    ],
    "check_list": [
        "3",
        "8",
        "9",
        "10",
        "14"
    ],
    "image_src": "791330_31odFZZoM2_JqkCPJGHXa_4500x1000.jpeg"
}

非常感谢您的帮助

在我看来,您需要的是一个简单的递归示例,不需要 Lodash...

注意:您使用的正则表达式仅匹配以出现一个或多个数字开始和结束的字符串... 因此,您应该使用 Number 来转换值,而不是使用 parseInt 或 parseFloat!

In Javascript Number 是类型 Number 的构造函数,但是,如果在没有 new 运算符的情况下调用,则执行基本的转换。 它 returns NaN 当转换不令人满意时,因此,使用 运算符我们可以保留原始值!

希望有帮助...

var myObject = {
    "real_name": "Test",
    "maker": "Jean-Paul",
    "company": "",
    "real_id": "646402",
    "clean_id": "152691",
    "year": 2013,
    "type": "Red real",
    "available_for_order": 0,
    "level": null,
    "bio": null,
    "temperature": "15",
    "potential": "3",
    "country_code": "USA",
    "coord_lng": "2.7014349999999",
    "coord_lat": "42.717317",
    "real_description": [
        {
            "comment": "Real good stuff",
            "lang": "it",
            "video_end": null,
            "video_id": null,
            "video_start": null,
            "video_url": null
        },
        {
            "comment": "Awesome and cheap stuff",
            "lang": "en",
            "video_end": null,
            "video_id": null,
            "video_start": null,
            "video_url": null
        }
    ],
    "full_description": [
        {
            "description": "Long description",
            "lang": "fr"
        },
        {
            "description": "",
            "lang": "en"
        }
    ],
    "list": [
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 0,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "656732",
            "year": "1"
        },
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 0,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "330381",
            "year": "2008"
        },
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 20,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "11453216",
            "year": "2010"
        },
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 0,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "11497420",
            "year": "2011"
        },
        {
            "available_for_order": "0",
            "capacity": "4500",
            "conciergerie": "1",
            "currency_code": "EUR",
            "price": 10,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "11506715",
            "year": "2012"
        },
        {
            "available_for_order": "1",
            "capacity": "4500",
            "conciergerie": "0",
            "currency_code": "EUR",
            "price": 10,
            "quantity": 0,
            "retail_price": 0,
            "real_id": "11458207",
            "year": "2013"
        }
    ],
    "check_list": [
        "3",
        "8",
        "9",
        "10",
        "14"
    ],
    "image_src": "791330_31odFZZoM2_JqkCPJGHXa_4500x1000.jpeg"
};


function recurse(obj) {
  for(var key in obj) {
    if(!obj.hasOwnProperty(key)) { continue; }
    
    if('object' === typeof obj[key]) {
      recurse(obj[key]);
    } else {
      console.log(key, obj[key], typeof obj[key],  ' ==> ', typeof (Number(obj[key]) || obj[key]));
      obj[key] = Number(obj[key]) || obj[key];
    }
  
  }
}

recurse(myObject);

var parseObjectProperties = function (obj) {
    _.each(obj, function(val, key) {
        if (typeof(key) === 'object') {
            parseObjectProperties(key);
        } else {
            if (getType(val) === 'float') {
                myObject[key] = parseFloat(val);
            } else if (getType(val) === 'int') {
                myObject[key] = parseInt(val);
            } else if (val === null) {
                myObject[key] = 0;
            }
        }
    });
};

var getType = function(input) {
    var match = (/[\d]+(\.[\d]+)?/).exec(input);
    if (match ) {
       if (match [1]) { 
           return 'float'; 
       } else { 
           return 'int'; 
       }          
    }
    return 'string';
}

exploreObject(myObject);