繁体   English   中英

需要合并具有相同键但具有不同值的对象

[英]Need to merge objects with the same keys but different values

我想找到最短,最漂亮的方法来转换具有相同类别键值的对象数组:

[{
  "label": "Apple",
  "category": "Fruits"
}, {
  "label": "Orange",
  "category": "Fruits"
}, {
  "label": "Potato",
  "category": "Vegetables"
}, {
  "label": "Tomato",
  "category": "Vegetables"
}, {
  "label": "Cherry",
  "category": "Berries"
}]

到具有相同类别的分组标签的那个:

[{
  "label": ["Apple", "Orange"],
  "category": "Fruits"
}, {
  "label": ["Potato", "Tomato"],
  "category": "Vegetables"
}, {
  "label": ["Cherry"],
  "category": "Berries"
}]

您可以将对象用作哈希表并对类别进行分组。

 var data = [{ "label": "Apple", "category": "Fruits" }, { "label": "Orange", "category": "Fruits" }, { "label": "Potato", "category": "Vegetables" }, { "label": "Tomato", "category": "Vegetables" }, { "label": "Cherry", "category": "Berries" }], grouped = []; data.forEach(function (a) { if (!this[a.category]) { this[a.category] = { label: [], category: a.category }; grouped.push(this[a.category]); } this[a.category].label.push(a.label); }, Object.create(null)); console.log(grouped); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

这是我如何使用lodash做到这一点:

_(coll)
  .groupBy('category')
  .map((v, k) => ({
    category: k,
    label: _.map(v, 'label')
  }))
  .value()

基本上, groupBy()创建一个具有唯一类别作为键的对象。 然后, map()将此对象转换回数组,其中每个项目都具有您需要的结构。

这是我尝试解决您的问题

 var result = []; var input = [{ "label": "Apple", "category": "Fruits" }, { "label": "Orange", "category": "Fruits" }, { "label": "Potato", "category": "Vegetables" }, { "label": "Tomato", "category": "Vegetables" }, { "label": "Cherry", "category": "Berries" }]; var cat = []; for(i = 0; i < input.length; i++) { if(!cat[input[i].category]) { cat[input[i].category] = {category: input[i].category, label:[input[i].label]}; result.push(cat[input[i].category]); } else { cat[input[i].category].label.push(input[i].label); } } console.log(result); 

暂无
暂无

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

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