如何将某些对象键分离到自己的数组中?

时间:2015-07-10 01:31:49

标签: javascript json mongodb underscore.js

这是我在这里的第一个问题。似乎没有其他地方被问到,但是我再也不确定如何说出我的问题。

如何转换如下所示的数组:

var message = {
    pay_key: '12345',
    'transaction[0].sender_id': 'abc',
    'transaction[0].is_primary_receiver': 'false',
    'transaction[0].id': 'def',
    'transaction[1].sender_id': 'xyz',
    'transaction[1].is_primary_receiver': 'false',
    'transaction[1].id': 'tuv',
};

这样的事情:

{
pay_key : '12345',
transaction : [
    {
        sender_id : 'abc',
        is_primary_receiver : 'false',
        id : 'def'
    },
    {
        sender_id : 'xyz',
        is_primary_receiver : 'false',
        id : 'tuv'
    }
]
}        

我无法控制第一个对象的格式,因为它来自外部服务。我试图将消息对象插入到MongoDB集合中,但是当我尝试按原样插入时,我收到错误。所以我试图把它变成正确的形式。

我应该使用Underscore吗?我已经玩过_.each,但无法让它发挥作用。

3 个答案:

答案 0 :(得分:1)

我的接受..

var message = {
    pay_key: '12345',
    'transaction[0].sender_id': 'abc',
    'transaction[0].is_primary_receiver': 'false',
    'transaction[0].id': 'def',
    'transaction[1].sender_id': 'xyz',
    'transaction[1].is_primary_receiver': 'false',
    'transaction[1].id': 'tuv',
};

message.transaction=[];
for (var p in message) {
  var m = p.match(/^transaction\[(\d+)\]\.(.*)/);
  if (m&&m[1]&&m[2]) {
    message.transaction[m[1]]=message.transaction[m[1]]||{};
    message.transaction[m[1]][m[2]]=message[p];
    delete message[p];
  }
}

答案 1 :(得分:0)

这是我刚刚发起的通用功能

function makeObject(message) {
    var retObj = {},
        makePath = function (p, pos) {
            if (/\[\d+\]$/.test(p)) {
                var q = p.split(/[\[\]]/),
                    r = q[0],
                    s = q[1];
                if (!pos[r]) {
                    pos[r] = [];
                }
                return pos[r][s] = pos[r][s] || {};
            }
            return pos[p] = pos[p] || {};
        };
    for(var k in message) {
        if (message.hasOwnProperty(k)) {
            if (k.indexOf('.') < 0) {
                retObj[k] = message[k];
            }
            else {
                var path = k.split('.'),
                    pos = retObj,
                    last = path.pop();
                path.forEach(function(p) {
                    pos = makePath(p, pos);
                });
                pos[last] = message[k];
            }
        }
    }
    return retObj;
}

它可以按要求运行,但我确信有更好的代码可以实现

答案 2 :(得分:0)

有类似的回应,所以无论如何都要添加它:

Object.keys(message).forEach(function(key) {
    var keySplit = key.split( /\[|\]\./g )
    if  ( keySplit.length != 1 ) {
        if ( !message.hasOwnProperty(keySplit[0]) )
            message[keySplit[0]] = [];
        message[keySplit[0]][keySplit[1]] = message[keySplit[0]][keySplit[1]]||{};
        message[keySplit[0]][keySplit[1]][keySplit[2]] = message[key];
        delete message[key];
    }
});