繁体   English   中英

使用Underscore将嵌套的JSON展平为键值数组

[英]Flatten nested JSON into a keyed array of values using Underscore

从我的服务器剩余API中,我请求一个具有以下结构的javascript对象:

[
  {
    "msgID": 3,
    "admTag": {
      "tagName": "Employee"
    }
  },
  {
    "msgID": 3,
    "admTag": {
      "tagName": "Safety"
    }
  },
  {
    "msgID": 3,
    "admTag": {
      "tagName": "Performance"
    }
  },
  {
    "msgID": 7,
    "admTag": {
      "tagName": "Role Based Training"
    }
  },
  {
    "msgID": 7,
    "admTag": {
      "tagName": "Account Service Information"
    }
  },
  {
    "msgID": 6,
    "admTag": {
      "tagName": "Consumer Product Safety Improvement"
    }
  }
]

要在客户端上使用此对象,我需要将结构转换为通过msgID属性进行分组,并为其分配一个包含关联的tagName值的数组。 像这样:

[{
    "3": ["Employee","Safety","Performance"],
    "7": ["Role Based Training","Account Service Information"],
    "6": ["Consumer Product Safety Improvement"]
}]

我可以使用嵌套的for循环来完成此操作,但是我知道使用下划线可以更高效地完成代码,而且代码更少。 使用groupBy,我可以对msgID进行分组,这给了我所需的密钥:

_.groupBy(tags.tags, function(model){ 
  return model.msgID;
});

...但是我不确定如何从结果对象中“抽出” tagName并将其分配给正确的msgID。

非常感谢任何帮助!

用纯Javascript解决方案。 只需四行代码。

 var array = [{ "msgID": 3, "admTag": { "tagName": "Employee" } }, { "msgID": 3, "admTag": { "tagName": "Safety" } }, { "msgID": 3, "admTag": { "tagName": "Performance" } }, { "msgID": 7, "admTag": { "tagName": "Role Based Training" } }, { "msgID": 7, "admTag": { "tagName": "Account Service Information" } }, { "msgID": 6, "admTag": { "tagName": "Consumer Product Safety Improvement" } }], result = {}; array.forEach(function (a) { result[a.msgID] = result[a.msgID] || []; result[a.msgID].push(a.admTag.tagName); }); document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>'); 

下划线使用_.reduce

var result = _.reduce(tags.tags, function(l, r) {
    if (typeof l[r.msgID] === "undefined") {
        l[r.msgID] = [];
    }
    l[r.msgID].push(r.admTag.tagName);
    return l;
}, {});

小提琴

使用本地Array.prototype.reduce几乎可以使用相同的代码来实现相同的目的

var result = tags.tags.reduce(function(l, r) {
    if (typeof l[r.msgID] === "undefined") {
        l[r.msgID] = [];
    }
    l[r.msgID].push(r.admTag.tagName);
    return l;
}, {});

小提琴

使用.groupBy .mapValues_.map您可以执行以下操作:

var output = _(input)
  .groupBy('msgID')                         // Group by msgId
  .mapValues(function(group) {              // Transform value of each group
    return _.map(group, 'admTag.tagName');  // Return array of tagNames
  })
  .value();

jsFiddle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM