【问题标题】:what is the best way to convert the values in this data set from strings to int将此数据集中的值从字符串转换为 int 的最佳方法是什么
【发布时间】:2017-04-15 11:01:21
【问题描述】:

这是我的数据集:

data_p = [
[   {"key":"Device_Model","value":"test_model"},
    {"key":">20MB/30","value":"11"},
    {"key":">200MB/30","value":"33"},
    {"key":">2048MB/30","value":"10"},
    {"key":">5120MB/30","value":"55"},
    {"key":">10240MB/30","value":"10"}
],
[{"key":"Device_Model","value":"0P6B670"},
{"key":">20MB/30","value":"9"},
{"key":">200MB/30","value":"8"},
{"key":">2048MB/30","value":"2"},
{"key":">5120MB/30","value":"23"},
{"key":">10240MB/30","value":"23"}],
[{"key":"Device_Model","value":"0P6B680"},
{"key":">20MB/30","value":"1"},
{"key":">200MB/30","value":"23"},
{"key":">2048MB/30","value":"23"},
{"key":">5120MB/30","value":"23"},
{"key":">10240MB/30","value":"23"}],
[{"key":"Device_Model","value":"0P6B810"},
{"key":">20MB/30","value":"5"},
{"key":">200MB/30","value":"4"},
{"key":">2048MB/30","value":"1"},
{"key":">5120MB/30","value":"1"},
{"key":">10240MB/30","value":"1"}],
[   {"key":"Device_Model","value":"0P6B900"},
{"key":">20MB/30","value":"4"},
{"key":">200MB/30","value":"4"},
{"key":">2048MB/30","value":"1"},
{"key":">5120MB/30","value":"23"},
{"key":">10240MB/30","value":"23"}]]

这是我所做的,但我想知道减少、映射或过滤是一种更好的方法。我的意思是我应该在 forEach 函数中使用 for 循环吗?我也不喜欢 i

data_p.forEach(function(d){for(i=1; i<6; i++){console.log(d[i].value); d[i].value=+d[i].value}})

这会给我:

    data_p = [
    [   {"key":"Device_Model","value":"test_model"},
        {"key":">20MB/30","value":11},
        {"key":">200MB/30","value":33},
        {"key":">2048MB/30","value":10},
        {"key":">5120MB/30","value":55},
        {"key":">10240MB/30","value":10}
    ],
...

那么问题是有没有更好的方法来实现这一点?

【问题讨论】:

    标签: javascript string int dataset converter


    【解决方案1】:

    有很多方法可以做到这一点。

    例如使用array.forEacharray.reduce 更新data_p

    data_p.forEach( function(a) {
        a.reduce( function( ignore, obj) {
             obj.value = Number(obj.value);
        });
    });
    

    这修改了使用reduce来迭代所有数组元素除了第一个。可以扩展检查转换为数字的值是否为数字:

    data_p.forEach( function(a) {
        a.reduce( function( ignore, obj) {
             var temp = Number(obj.value);
             if( !isNaN(temp) {
                  obj.value = temp;
             }
        });
    });
    

    例如使用array.map新建数组和内容数组

    var newArray = data_p.map( a => a.map( (o,i)=>(
        { key: o.key,
          value: o.key=="Device_Model" ? o.value : +o.value}
    )));
    

    与第一个示例不同,此方法不会改变 data_p(或其中的对象)并假定 data_p 包含有效条目。

    【讨论】:

      【解决方案2】:

      为什么不使用i

      但是,我不确定正在完成什么或为什么。最终结果似乎是您的代码值从字符串转换为数字,但原因尚不清楚。

      【讨论】:

        【解决方案3】:

        迭代所有元素。检查值是否为数字(isNaN)然后更新属性

        var data_p = [
        [   {"key":"Device_Model","value":"test_model"},
            {"key":">20MB/30","value":"11"},
            {"key":">200MB/30","value":"33"},
            {"key":">2048MB/30","value":"10"},
            {"key":">5120MB/30","value":"55"},
            {"key":">10240MB/30","value":"10"}
        ],
        [{"key":"Device_Model","value":"0P6B670"},
        {"key":">20MB/30","value":"9"},
        {"key":">200MB/30","value":"8"},
        {"key":">2048MB/30","value":"2"},
        {"key":">5120MB/30","value":"23"},
        {"key":">10240MB/30","value":"23"}],
        [{"key":"Device_Model","value":"0P6B680"},
        {"key":">20MB/30","value":"1"},
        {"key":">200MB/30","value":"23"},
        {"key":">2048MB/30","value":"23"},
        {"key":">5120MB/30","value":"23"},
        {"key":">10240MB/30","value":"23"}],
        [{"key":"Device_Model","value":"0P6B810"},
        {"key":">20MB/30","value":"5"},
        {"key":">200MB/30","value":"4"},
        {"key":">2048MB/30","value":"1"},
        {"key":">5120MB/30","value":"1"},
        {"key":">10240MB/30","value":"1"}],
        [   {"key":"Device_Model","value":"0P6B900"},
        {"key":">20MB/30","value":"4"},
        {"key":">200MB/30","value":"4"},
        {"key":">2048MB/30","value":"1"},
        {"key":">5120MB/30","value":"23"},
        {"key":">10240MB/30","value":"23"}]]
        
        
        
        data_p.forEach(list => 
               list.forEach(pair => 
                    !isNaN(pair.value) && (pair.value = Number(pair.value))
               )
        );
        
        console.log(data_p);

        【讨论】:

        • tks,你能简单解释一下它的作用吗?什么是对、=> 和列表? tks
        • 好吧,我只是给出了参数名称以使其可读。您的根数据结构包含对象数组。它们是一种数据列表,因此我将它们中的每一个命名为“列表”。列表内容包含键和值属性。从理论上讲,它们是一种键值对。因此,我将它们中的每一个命名为“对”。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        • 2019-03-29
        • 2012-02-29
        • 2011-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多