V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lijinma
V2EX  ›  Node.js

nodejs 中 json 对象操作问题,没学好 javascript,哎

  •  
  •   lijinma · 2014-03-04 21:58:35 +08:00 · 12023 次点击
    这是一个创建于 3918 天前的主题,其中的信息可能已经有所发展或是发生改变。
    是一个json处理的问题;

    问题:

    var obj1 = [
    {
    userid: 'james',
    status: 'open',
    open_count: 2
    },
    {
    userid: 'james',
    status: 'pending',
    pending_count: 3
    },
    {
    userid: 'livid',
    status: 'open',
    close_count: 5
    },
    ...
    ]

    处理 obj1 生成 obj2:
    [
    {
    userid: 'james',
    open_count: 2,
    pending_count: 3
    },
    {
    userid: 'livid',
    open_count: 5,
    pending_count: 2
    },
    ...
    ]


    感觉很简单,但是没成功,多谢;
    14 条回复    1970-01-01 08:00:00 +08:00
    lijinma
        1
    lijinma  
    OP
       2014-03-04 22:14:41 +08:00
    lijinma
        2
    lijinma  
    OP
       2014-03-04 22:15:14 +08:00
    求大神帮帮忙 -。-
    gaodong
        3
    gaodong  
       2014-03-04 23:04:53 +08:00
    用coffee写了一个,不知道还有没有简便的方式:
    temp = {}
    for entry in obj1
    temp[entry.userid]?=
    userid:entry.userid
    open_count:0
    pending_count:0
    temp[entry.userid].open_count += Number entry.open_count || 0
    temp[entry.userid].pending_count += Number entry.pending_count || 0

    console.log temp
    array = (v for k, v of temp)
    console.log array
    array 应该就是你要的结果
    shenqi
        4
    shenqi  
       2014-03-04 23:13:55 +08:00
    JSON.stringify(obj1);
    JSON.parse(JSON.stringify(obj1));
    哪个是你想要的效果?
    shenqi
        5
    shenqi  
       2014-03-04 23:18:30 +08:00
    抱歉我看错题了,之前去面试的时候就是考这题目,题目不错。
    shenqi
        6
    shenqi  
       2014-03-04 23:34:31 +08:00   ❤️ 1
    var obj1 = [{
    userid: 'james',
    status: 'open',
    open_count: 2
    }, {
    userid: 'james',
    status: 'pending',
    pending_count: 3
    }, {
    userid: 'livid',
    status: 'open',
    close_count: 5
    }]

    function objConut(obj) {
    var returnObj = [], tempObj = {}, i, j, l, objI;
    for( i = 0, l = obj.length; i < l; i++){
    objI = obj[i];
    tempObj[objI.userid] = tempObj[objI.userid] || {}
    tempObj[objI.userid].userid = objI.userid;
    tempObj[objI.userid][objI.status+"_count"] = objI[objI.status+"_count"] +
    ( tempObj[objI.userid][objI.status+"_count"] || 0 );
    }
    for( j in tempObj ){
    returnObj.push( tempObj[j] )
    }
    return returnObj;

    }
    objConut(obj1);

    try it。
    lijinma
        7
    lijinma  
    OP
       2014-03-04 23:46:15 +08:00
    @shenqi 多谢兄弟!!!你的思路很好,按你的思路,已经解决!!!!!!

    再次感谢;
    yyfearth
        8
    yyfearth  
       2014-03-05 03:04:35 +08:00
    基本上就是用一个 Object (相当于HashTable) 根据 userid 做 index 就可以解决吧
    RIcter
        9
    RIcter  
       2014-03-05 06:21:08 +08:00   ❤️ 1
    @shenqi 感觉不算特别难...面试真的考这个么Σ(゚Д゚)
    alexrezit
        10
    alexrezit  
       2014-03-05 07:16:41 +08:00
    status 有用?
    alexrezit
        11
    alexrezit  
       2014-03-05 07:16:56 +08:00
    @RIcter
    快加入我大 node 神教啦!
    rexren
        12
    rexren  
       2014-03-05 12:27:24 +08:00
    典型的reduce操作。如果有underscore的话:

    var _ = require('lodash');

    _.reduce(obj, function (memo, element) {
    if (!memo[element.userid]) {
    memo[element.userid] = {}
    }
    memo[element.userid][element.status+'_count'] = element[element.status+'_count'];
    return memo;
    }, {});
    shenqi
        13
    shenqi  
       2014-03-05 12:49:05 +08:00
    @RIcter 只是一个基础的编程题而已,而且当时题目与这个类似。
    lijinma
        14
    lijinma  
    OP
       2014-03-05 14:08:10 +08:00
    @rexren 大神谢谢你!!!!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3373 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:33 · PVG 20:33 · LAX 04:33 · JFK 07:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.