2015-07-10 51 views
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', 
}; 

弄成这个样子:

{ 
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,但无法让它工作。

+0

@JaromandaX - “cromulent”似乎是一个合适的描述(尽管我必须承认我必须查看它)。尤克是如何描述它的。在产生这种情况的上游代码中必须有一些东西被破坏,因为没有人会故意要以这种方式向人们发送数据。 – jfriend00

回答

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]; 
    } 
} 
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; 
} 

它为需要工作,但我敢肯定有一些更好的代码做

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]; 
    } 
}); 
相关问题