在underscore.js中展平嵌套数组/对象 [英] flattening nested arrays/objects in underscore.js

查看:172
本文介绍了在underscore.js中展平嵌套数组/对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个对象数组,如下所示(尽管下面的例子只有数组中的一个元素)

  [ 
{
正常运行时间:0,
加载:{x:0.11,y:0.22,z:0.33},
cpu :[
{u:111,n:112,s:113,i:114,q:115},
{u:211, n:212,s:213,i:214,q:215}
]
}
]

我试图使用underscore.js来展平每个元素,所以整个数组看起来像这样:

  [
{
正常运行时间:0,

load_x:0.11
load_y:0.03
load_z:0.01,

cpu1_u:111,
cpu1_n:112,
cpu1_s:113,
cpu1_i :114,
cpu1_q:115,

cpu2_u:211,
cpu2_n:212,
cpu2_s:213,
cpu2_i:214,
cpu2_q:215,
}
]

我已经对'load'元素进行了排序(虽然不是一般),因为那只是一个已知的3字段对象。 / p>

扁平化cpu阵列虽然暗示了我。
我的代码如下,以及我的代码生成的输出



我知道我可以写一个js循环并完成它,但我见过一些非常优雅的下划线解决方案,我确信这是可能的。
有什么建议吗?



我的代码

  var profiles = [
{
uptime:0,
load:{x:0.11,y:0.22,z: 0.33},
cpu:[
{u:111,n:112,s:113,i:114,q:115},
{你:211,n:212,s:213,i:214,q:215}
]
}
];

var flat = _.map(profiles,function(profile){
var p = _.extend(_。omit(profile,'load'),{
load_1 :Math.round(100 * profile.load.x)/ 100,
load_5:Math.round(100 * profile.load.y)/ 100,
load_15:Math.round(100 * profile .load.z)/ 100
});

var cpuid = 0;
var cpuobject =
_.map(p.cpu,function(cpu) {
cpuid ++;
返回_.object(
_.map(cpu,function(val,key){
var arr = ['cpu'+ cpuid +'_'+ key,val];
return arr;
})
);
});
返回_.extend(_。省略(p,'cpu') ,cpuobject);
});

console.log(JSON.stringify(flat));

我的(错误)输出

  [
{
0:{
cpu1_u:233264700,
cpu1_n:0,
cpu1_s: 64485200,
cpu1_i:1228073616,
cpu1_q:86100
},
1:{
cpu2_u:233264700,
cpu2_n:0,
cpu2_s:64485200,
cpu2_i:1228073616,
cpu2_q:86100
},
正常运行时间:0,
load_1:0.11,
load_5:0.03,
load_15:0.01
}
]


解决方案

例如:

  flatten = function(x,result,prefix){
if(_ .isObject(x)){
_.each(x,function(v,k){
flatten(v,result,prefix?prefix +'_'+ k:k)
})
} else {
result [prefix] = x
}
返回结果
}


a =
{
正常运行时间:0,
加载:{x :0.11,y:0.22,z:0.33},
cpu:[
{u:111,n:112,s:113,i :114,q:115},
{u:211,n:212,s:213,i:214,q:215}
]
}


result = flatten(a,{})






  {
正常运行时间:0,
load_x:0.11,
load_y:0.22,
load_z:0.33,
cpu_0_u:111,
cpu_0_n:112,
cpu_0_s:113,
cpu_0_i:114,
cpu_0_q:115,
cpu_1_u:211,
cpu_1_n:212,
cpu_1_s:213,
cpu_1_i:214,
cpu_1_q:215
}


I have an array of objects as shown below (although the example below has just one element in the array)

[
    {
        "uptime":0,
        "load":{"x":0.11,"y":0.22,"z":0.33},
        "cpu":[
            {"u":111,"n":112,"s":113,"i":114,"q":115}, 
            {"u":211,"n":212,"s":213,"i":214,"q":215}
        ]
    }
]

Im trying to flatten out each element using underscore.js, so the overall array looks like this:

[
    {
        "uptime":0,

        "load_x": 0.11
        "load_y": 0.03
        "load_z": 0.01,

        "cpu1_u": 111,
        "cpu1_n": 112,
        "cpu1_s": 113,
        "cpu1_i": 114,
        "cpu1_q": 115,

        "cpu2_u": 211,
        "cpu2_n": 212,
        "cpu2_s": 213,
        "cpu2_i": 214,
        "cpu2_q": 215,
    }
]

I've got the 'load' element sorted (albeit not generically), since thats just a known 3 field object.

Flattening the cpu array alludes me though. My code is below, along with the output my code is generating

I know I could just write a js loop and be done with it, but Ive seen some very elegant underscore solutions like this, and Im sure its possible. Any advice please?

My Code

var profiles = [
    {
        "uptime":0,
        "load":{"x":0.11,"y":0.22,"z":0.33},
        "cpu":[
            {"u":111,"n":112,"s":113,"i":114,"q":115}, 
            {"u":211,"n":212,"s":213,"i":214,"q":215}
        ]
    }
];

var flat = _.map(profiles, function(profile) {
        var p = _.extend(_.omit(profile, 'load'), {
            load_1: Math.round(100*profile.load.x)/100, 
            load_5: Math.round(100*profile.load.y)/100, 
            load_15: Math.round(100*profile.load.z)/100
        });

        var cpuid = 0;
        var cpuobject =
            _.map(p.cpu, function(cpu) {
                cpuid++;
                return _.object(
                    _.map(cpu, function(val, key) {
                        var arr = ['cpu'+cpuid+'_'+key, val];
                        return arr;
                    })
                );
            });
        return _.extend(_.omit(p, 'cpu'), cpuobject);
    });

console.log(JSON.stringify(flat));

My (Wrong) Output

[
    {
        0: {
            cpu1_u: 233264700,
            cpu1_n: 0,
            cpu1_s: 64485200,
            cpu1_i: 1228073616,
            cpu1_q: 86100
        },
        1: {
            cpu2_u: 233264700,
            cpu2_n: 0,
            cpu2_s: 64485200,
            cpu2_i: 1228073616,
            cpu2_q: 86100
        },
        uptime: 0,
        load_1: 0.11,
        load_5: 0.03,
        load_15: 0.01
    }
]

解决方案

For example:

flatten = function(x, result, prefix) {
    if(_.isObject(x)) {
        _.each(x, function(v, k) {
            flatten(v, result, prefix ? prefix + '_' + k : k)
        })
    } else {
        result[prefix] = x
    }
    return result
}


a =
{
    "uptime":0,
    "load":{"x":0.11,"y":0.22,"z":0.33},
    "cpu":[
        {"u":111,"n":112,"s":113,"i":114,"q":115},
        {"u":211,"n":212,"s":213,"i":214,"q":215}
    ]
}


result = flatten(a, {})


{
        "uptime": 0,
        "load_x": 0.11,
        "load_y": 0.22,
        "load_z": 0.33,
        "cpu_0_u": 111,
        "cpu_0_n": 112,
        "cpu_0_s": 113,
        "cpu_0_i": 114,
        "cpu_0_q": 115,
        "cpu_1_u": 211,
        "cpu_1_n": 212,
        "cpu_1_s": 213,
        "cpu_1_i": 214,
        "cpu_1_q": 215
}    

这篇关于在underscore.js中展平嵌套数组/对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆