【问题标题】:How can I separate certain object keys into their own array?如何将某些对象键分离到它们自己的数组中?
【发布时间】:2015-07-10 01:31:48
【问题描述】:

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

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

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 集合中,但是当我尝试按原样插入时,出现错误。所以我试图把它变成正确的形式。

我应该为此使用下划线吗?我玩过 _.each 但无法让它工作。

【问题讨论】:

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

标签: javascript json mongodb underscore.js


【解决方案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];
  }
}

【讨论】:

    【解决方案2】:

    这是我刚刚创建的一个通用函数

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

    它按要求工作,但我确信有一些更好的代码可以做到这一点

    【讨论】:

      【解决方案3】:

      有类似的反应,所以还是添加它:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-13
        • 2021-03-13
        • 2020-12-21
        • 2021-12-25
        • 2014-08-12
        • 1970-01-01
        • 2019-08-07
        • 2021-08-23
        相关资源
        最近更新 更多