javascript - JS : Reorganize objects inside an array based on value of a particular key (reduce?)

标签 javascript arrays grouping aggregate reduce

这是 this one 的后续问题,尽管两者在操作上无关

<小时/>

从这种结构开始:

[ [{ field: "field1", term: "val1"},
   { field: "field2", term: "val2"}
  ],
  [{ field: "field3", term: "val3"},
   { field: "field3", term: "val4"},
   { field: "field4", term: "val5"}
  ],
  [{ field: "field3", term: "val6"},
   { field: "field2", term: "val7"},
   { field: "field3", term: "val8"},
   { field: "field1", term: "val9"},
   { field: "field2", term: "val10"}
  ]
]

我需要迭代每个子数组,并且对于里面的每个对象,当键field相同时,将键term的值聚合到一个数组中;并且在同一场合将关键 term 的所有值包装在一个数组中,以便稍后简单起见。最终结果如下:

[ [{ field: "field1", term: ["val1"]},
   { field: "field2", term: ["val2"]}
  ],
  [{ field: "field3", term: ["val3", "val4"},
   { field: "field4", term: ["val5"]}
  ],
  [{ field: "field3", term: ["val6", "val8"]},
   { field: "field2", term: ["val7", "val10"]},
   { field: "field1", term: ["val9"]}
  ]
]
<小时/>

我尝试过对每个对象使用 _.reduce ,得到了相对接近的结果,但从未完全达到目标。根本不掌握这种模式,我不相信 reduce 是可行的方法

有什么想法或指示吗?两天来一直在尝试包装这个......:S

谢谢

最佳答案

好吧,您可以为每个数组创建一个新对象,该对象以“field”值作为键,以“term”数组作为值。然后您可以将其转换回原始形式的对象。

var newArray = array.map(function( subArray ) {
  var obj = subArray.reduce(function(m, o) {
    if (o.field in m)
      m[o.field].push(o.term);
    else
      m[o.field] = [o.term];
    return m;
  }, {});

  return Object.keys(obj).map(function(field) {
    return { field: field, term: obj[field] };
  });
});

关于javascript - JS : Reorganize objects inside an array based on value of a particular key (reduce?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23048682/

相关文章:

sql - 如何通过其他 3 个表的每种可能组合对表中的一组行进行分组?

php - 用于 PHP Loop 的 Google API 库

c# - 如何编辑类数组中的变量

python - 从数据框中删除未出现一定次数的用户名?

javascript - 如何正确设置 Material-ui 中某些元素的颜色?

javascript - 将数组更改为对象

java - 对对象进行分组的算法

javascript - SVG-JavaScript 无法正确渲染

javascript - 从 Ajax 调用中的错误 block 返回延迟的 jQuery

javascript - 正则表达式从方括号内获取文本