为了账号安全,请及时绑定邮箱和手机立即绑定

使用对象分组数组项

使用对象分组数组项

萧十郎 2019-08-03 14:03:09
使用对象分组数组项我的数组是这样的:myArray = [   {group: "one", color: "red"},   {group: "two", color: "blue"},   {group: "one", color: "green"},   {group: "one", color: "black"}]我想把它转换成:myArray = [   {group: "one", color: ["red", "green", "black"]}   {group: "two", color: ["blue"]}]所以,基本上,按group.我在努力:for (i in myArray){   var group = myArray[i].group;   //myArray.push(group, {???})}我只是不知道如何处理类似组值的分组。
查看完整描述

3 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

首先,在JavaScript中,使用for ... in..看见为什么在数组迭代中使用“for.in”是个坏主意?关于细节。

所以你可以试试这样的方法:

var groups = {};for (var i = 0; i < myArray.length; i++) {
  var groupName = myArray[i].group;
  if (!groups[groupName]) {
    groups[groupName] = [];
  }
  groups[groupName].push(myArray[i].color);}myArray = [];for (var groupName in groups) {
  myArray.push({group: groupName, color: groups[groupName]});}

利用中介groups对象可以帮助加快速度,因为它允许您避免嵌套循环来搜索数组。还有,因为groups是一个对象(而不是数组)使用for ... in是合适的。

增编

FWIW,如果希望避免在结果数组中重复颜色项,则可以添加if线上语句groups[groupName].push(myArray[i].color);以防重复。使用jQuery,它将如下所示;

if (!$.inArray(myArray[i].color, groups[groupName])) {
  groups[groupName].push(myArray[i].color);}

如果没有jQuery,您可能希望添加一个与jQuery的函数相同的函数inArray:

Array.prototype.contains = function(value) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] === value)
      return true;
  }
  return false;}

然后像这样使用它:

if (!groups[groupName].contains(myArray[i].color)) {
  groups[groupName].push(myArray[i].color);}

请注意,在这两种情况下,由于所有额外的迭代,您都会放慢速度,所以如果您不需要避免结果数组中的重复颜色条目,我建议您避免这段额外的代码。那里




查看完整回答
反对 回复 2019-08-04
  • 3 回答
  • 0 关注
  • 353 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信